C++ 分配和填充大型数组

C++ 分配和填充大型数组,c++,arrays,heap,C++,Arrays,Heap,我想分配和初始化一个非常大的无符号长整数数组。这个数组是一个简单的一维数组,我想用前N个素数的值填充它。我已经有了一个程序,可以将这些内容输出到一个.cpp文件中以供包含。我只是不确定初始化数组的语法。我知道 unsigned long int *known = new unsigned long int[N]; 将在堆上创建数组,但我不确定如何初始化成员。基本上只需循环数组并为每个元素指定正确的值,如下所示: for(size_t idx = 0; idx < N; ++idx) {

我想分配和初始化一个非常大的无符号长整数数组。这个数组是一个简单的一维数组,我想用前N个素数的值填充它。我已经有了一个程序,可以将这些内容输出到一个.cpp文件中以供包含。我只是不确定初始化数组的语法。我知道

unsigned long int *known = new unsigned long int[N];

将在堆上创建数组,但我不确定如何初始化成员。

基本上只需循环数组并为每个元素指定正确的值,如下所示:

for(size_t idx = 0; idx < N; ++idx)
{
  *(known + idx) = retrieve_value(idx);
}

也就是说,除非有很好的理由以这种方式更新阵列,否则我强烈建议在这种情况下使用标准容器之一,如std::vector或std::array,因为这样可以避免目前不必要的内存管理问题。如果N在编译时已知,
std::array
的开销可能较小,否则使用带有适当reserve()调用的
std::vector
也可以很好地完成这项工作。如果必须从可用内存中挤出最后一个字节,我建议您只处理原始内存。

我建议您创建一个数组初始值设定项类,该类将接受指向数组的指针和要创建的元素数。使用此类的全局变量。 创建后,构造函数将填充数组

    class ArrayInitializer{
       ArrayInitializer(unsigned long* ptr, size_t Size);
       ...
       ...
    };
现在创建一个全局变量

    //include your header here,
    ArrayInitializer g_arrayInit(known,N);

一旦程序开始执行,就会创建全局变量。您还可以使用这个类来清理使用“new”分配的内存

,因此我做了一些研究,采纳了您的建议并尝试了这个方法,以便在堆上定义它:std::vector*known=new vector;已知[1]=2;已知[2]=3;已知[3]=5;已知[4]=7;已知[5]=11;已知[6]=13;已知[7]=17;已知[8]=19;已知[9]=23;已知[10]=29;已知[11]=31;已知[12]=37;j=已知[i];但我还是会出错。声明工作正常,但它不允许我填充成员。我仍在学习/重新学习这方面的很多内容,所以感谢你们两位的帮助。您不需要在堆上分配向量。无论如何,在大多数情况下,实现都会自动为存储执行此操作。只需使用已知的
std::vector。如果您想像上面写的那样将赋值用于向量,您还需要调用
known.resize(size)
或在创建时初始化/调整向量大小。请查看cppreference.com或类似网站,了解向量API的完整描述。好的,我掌握了正确的语法。如果我把它直接粘贴到我的程序中,它就会工作。如果我将定义包含在KnownPrimes.h中,尽管我会得到一个编译器错误“g++:error:KnownPrimes.o:没有这样的文件或目录”。为什么编译器要寻找一个.o文件呢?另一个小贴士是Eclipse正在向链接器提供KnownPrimes.o。我想的问题是,为什么Eclipse试图让gcc链接一个它从未创建过的文件?我不太明白这会买什么原始海报?特别是全局变量部分。
    //include your header here,
    ArrayInitializer g_arrayInit(known,N);