c++ - 将大量数据初始化到 C++ 容器中的最佳方法?

标签 c++ containers constants hardcode large-data

例如:

InitEmployee()
{
    vector<Employee> employeeList = {
        Employee("Clark Kent",0),
        Employee("Bruce Wayne",1),
        ...
        Employee("Hal Jordan",65535)
    }
}

我无法从文件或数据库中查询,因为该程序需要在单个可执行文件中,因此所有常量数据都必须进行硬编码。我实际上使用 boost 的 multi_index_container 通过名称和 id 进行快速查找,但为了简单起见,我在这里使用 vector 作为示例。问题是我不能在没有堆栈溢出的情况下在单个函数中拥有那么多 (2^16) 常量数据。有没有更好的方法在不拆分函数的情况下初始化这个列表?

我正在使用 VC12。谢谢!

更新

查看所选答案。正如其他人提到的那样,使用 static 将迫使它继续处理数据而不是堆栈。这就是我最终得到的:

InitEmployee()
{
    static Employee employeeList[] = {
        {"Clark Kent",0},
        {"Bruce Wayne",1},
        ...
        {"Hal Jordan",65535}
    }

    vector<Employee*> employeeVec;
    int count = sizeof(employeeList) / sizeof(Employee);
    for (int i = 0; i < count; i++)
    {
        employeeVec.emplace(&employeeList[i]);
    }
}

问题是 Employee 类使用字符串类而不是 c 字符串,所以我不希望它在内存中有两个拷贝。这样我就得到了额外的指针内存,这仍然很多,但我相信这是最好的选择!也适用于 multi_index_container!谢谢

最佳答案

使用静态数组存储初始化数据。

InitEmployee()
{
    static char const* const names[] = {
        "Clark Kent",
        "Bruce Wayne",
        ...
        "Hal Jordan"
    };

    size_t const n = sizeof(names) / sizeof(*names);

    vector<Employee> employeeList;
    employeeList.reserve(n);
    for (size_t i=0; i<n; ++i)
        employeeList.emplace_back(names[i],i);
    ...
}

关于c++ - 将大量数据初始化到 C++ 容器中的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22796198/

相关文章:

c++ - 未命名命名空间中的变量自动初始化为 0?

c++ - 是否有任何模块(GPU 模块除外)实际上需要 GPU?

c++ - 在类中传递私有(private)变量 - 为什么不允许这样做?

c++ - 调用函数并将其设置为等于结构

c++ - 我可以告诉 direct3d 使用 alpha channel 渲染吗?

c++ - 将原始数组传递给 std::vector 的最快方法

objective-c - 方法定义可以指定参数必须是常量吗?

c++ - const char[] 和 char[] 的区别

文本溢出容器时的 HTML/CSS 换行符

windows - 在 server core 2019ltsc 容器镜像中添加字体