Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将大量数据初始化为C++;集装箱?_C++_Containers_Constants_Hardcode_Large Data - Fatal编程技术网

C++ 将大量数据初始化为C++;集装箱?

C++ 将大量数据初始化为C++;集装箱?,c++,containers,constants,hardcode,large-data,C++,Containers,Constants,Hardcode,Large Data,例如: InitEmployee() { vector<Employee> employeeList = { Employee("Clark Kent",0), Employee("Bruce Wayne",1), ... Employee("Hal Jordan",65535) } } InitEmployee() { 矢量员工列表={ 雇员(“克拉克肯特”,0), 雇员(“Bruce Wayne”,

例如:

InitEmployee()
{
    vector<Employee> employeeList = {
        Employee("Clark Kent",0),
        Employee("Bruce Wayne",1),
        ...
        Employee("Hal Jordan",65535)
    }
}
InitEmployee()
{
矢量员工列表={
雇员(“克拉克肯特”,0),
雇员(“Bruce Wayne”,1),
...
雇员(“哈尔·乔丹”,65535)
}
}
我不能从文件或数据库查询,因为这个程序需要在一个单一的可执行文件,所以所有的常量数据必须硬编码。实际上,我使用boost的multi_index_容器按名称和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]);
    }
}
InitEmployee()
{
静态员工员工列表[]={
{“克拉克肯特”,0},
{“布鲁斯·韦恩”,1},
...
{“哈尔·乔丹”,65535}
}
媒介雇员;
int count=sizeof(员工列表)/sizeof(员工);
for(int i=0;i

问题是Employee类使用的是string类而不是c-string,所以我不希望在内存中有两个副本。这样我就只剩下了指针的额外内存,这仍然很多,但我相信这是最好的选择!也适用于多索引容器!谢谢

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

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);
    ...
}
InitEmployee()
{
静态字符常量*常量名称[]={
“克拉克肯特”,
“布鲁斯·韦恩”,
...
“哈尔·乔丹”
};
大小常数n=sizeof(名称)/sizeof(*名称);
向量雇员列表;
雇员名单。储备(n);

对于(size\u t i=0;i您确定过多的字符串文字会导致堆栈溢出吗? 即使他们愿意,您也可以尝试将其置于全局范围内:

const char *data = R"(
Clark Kent,0
Bruce Wayne,1
...
Hal Jordan,65535)"

/* ... */

int main()
{
    /* ... */
}

如果它可以用巨大的字符串文字进行良好编译,您甚至可以尝试使用一些数据库文件中的原始数据,而不是列表。

因为您说您使用的是VC12,并且您有一个可执行文件(没有数据文件),然后将硬编码数据放在资源中,而不是程序代码中

适合的资源将是RCDATA类型。

有两个选项浮现在脑海中。第一个选项取决于Visual Studio的版本。您使用的是Visual Studio 2012还是版本12.0(令人困惑的是,VS2012实际上是11.0)。如果您使用的是2013(ie 12.0),那么您可以选择使用C++11中新增的初始值设定项列表(例如,请参阅)


您可以使用
/stack
链接器开关增大堆栈大小。或者您可以声明变量
static
,这将导致它进入数据段而不是堆栈。但是…为什么?编译器不喜欢大量数据-为什么不将其粘贴到文件中并直接读取它。如果这是Windows程序,请粘贴资源中的数据,而不是程序代码中的数据。有一个RCDATA资源是为“硬编码”保留的。对于大型数组,char*array将是一个很好的解决方案。您可以在需要时编写一个包装器类来返回Employee。我想您一定误解了我的评论,但您的代码仍然有两个字符串数据副本。正如我所说,除非您的
Employee
类只存储char指针,而不是han string对象。嗨!我想这对我来说可能真的有用,但我很好奇,这不意味着程序将有两个数据副本吗?一个来自char[]数组和容器中的第二个?谢谢!程序必须有两个数据副本,除非employee类实际上不存储字符串,而只存储指向字符数组的指针。字符串文本必须存储在某个地方。换句话说,在原始示例中,当您像这样调用构造函数时:
employee(“Clark Kent”),0)
,字符串文字
“Clark Kent”
需要存储在程序的数据中。然后将其复制到
Employee
对象中的字符串中。@Nah:但是,这是以存储65536个额外指针为代价的,这些指针将是MiB的1/4或1/2,具体取决于您的平台。将其设置为
静态字符常量*常量名称[]
,则编译器将能够将整个内容放在可执行文件的只读数据区域中。如果没有额外的
常量,它将无法执行此操作,因为您可能会编写
名称[0]=“foo”
等,即使它只是
字符常量*常量名称[]
编译器应该将其放入只读数据中,而不是分配一些堆栈。或者,如果您在文件范围内声明它,则无论如何都不可能发生这种情况。我以前尝试过这种方法,但它不起作用。我只是假设初始化列表无论如何都是在堆栈上创建的,因此它会溢出ined?如果您使用的是
char*
,那么请尝试使用
std::string
,因为如果字符串的长度超过(我认为),则可能会在堆上分配数据8个字符。@the_mandrill:它溢出的原因是指令中有太多的数据将数据插入向量。在第一个示例中,堆栈上有一个65536个元素的初始化列表。它将在初始化结束时消失,但如果它导致堆栈溢出,那就太晚了。在第二个示例中在这种情况下,您有65535个对重载逗号运算符的调用,每个调用都有一个Employee对象作为参数。这些调用和对象都在堆栈上。请注意,在我的回答中,我还创建了一个包含65536个元素(字符指针)的数组,但它不在堆栈上。然后在循环中使用每个指针将Employee对象插入向量。因此,我没有65536个单独的函数调用,只有一个函数调用,它运行65536次。
vector<Employee> employeeList = {
    {"Clark Kent",0},
    {"Bruce Wayne",1},
    ...
    {"Hal Jordan",65535}
};
#include <boost/assign/std/vector.hpp> // for 'operator+=()'
using namespace boost::assign; // bring operator+= into scope
vector<Employee> employeeList;
employeeList += Employee("Clark Kent", 0),
                Employee("Bruce Wayne", 1), ...