C++;大向量数组 我在C++中有大量向量的问题。 基本上,我不想要一个包含200万个元素的数组,每个元素都是一个向量(用于构建邻接列表)

C++;大向量数组 我在C++中有大量向量的问题。 基本上,我不想要一个包含200万个元素的数组,每个元素都是一个向量(用于构建邻接列表),c++,arrays,vector,C++,Arrays,Vector,所以当我做vector myList[10]时效果很好,但当我做vector myList[2000000]时效果不好,我不知道为什么 我试着做无符号长整型var=2000000;向量myList[var]但仍然是相同的错误。(我不知道是什么错误,我的程序刚刚崩溃) 如果你有任何想法 谢谢这两者之间有很大的区别。堆是一个很好的大空间,您可以在其中动态分配千兆字节的内存—堆栈在分配大小方面受到更多的限制(并且在编译时确定) 如果定义一个局部变量,这意味着它存在于堆栈上(就像数组一样)。对于200万

所以当我做
vector myList[10]
时效果很好,但当我做
vector myList[2000000]
时效果不好,我不知道为什么

我试着做
无符号长整型var=2000000;向量myList[var]但仍然是相同的错误。(我不知道是什么错误,我的程序刚刚崩溃)

如果你有任何想法


谢谢

这两者之间有很大的区别。堆是一个很好的大空间,您可以在其中动态分配千兆字节的内存—堆栈在分配大小方面受到更多的限制(并且在编译时确定)

如果定义一个局部变量,这意味着它存在于堆栈上(就像数组一样)。对于200万个元素,至少分配了2MB(或者假设每个向量使用约24B的堆栈,更像48MB),这对堆栈来说是相当大的一部分,可能会导致崩溃。动态分配
向量
s数组(或者最好只分配
向量
向量
)可确保从堆中分配大量内存,这可能会防止此崩溃

您还可以使用增加堆栈的大小,但这通常不比仅使用动态分配更可取。

我的\u列表
动态分配内存。或

将int的向量数组(
my_List
)声明为全局变量,大小为`const'。根据设计,它们的存储位置足够大,可以分配如此大的内存空间


对于局部变量,堆栈段可能很小,以分配2E6*24B.< /P>:您是想把这个数组声明为局部变量吗?也许有用-将<代码> var >代码>到<代码> const un签署long int < /> > -可变长度数组是编译器扩展,而不是C++的一部分。添加

常量
可以使其“正确”,因为数组长度是编译时确定的,这就消除了可疑行为的可能来源。请使用向量向量。正如您所看到的,尝试在堆栈上声明这样大小的数组很可能会失败。如果愿意,也可以将其设置为全局或静态。耸耸肩。我将尝试使用向量的向量,但我不明白,200万次24B对于内存来说并不是那么大:/
sizeof(vector)
大概在24字节左右。其中200万大约是45兆字节。默认堆栈大小通常比该值小得多,因此如果尝试将其设置为局部变量,则会出现堆栈溢出。在堆上,这并不是那么多。谢谢hnefatl,是的,有了向量向量,它就工作了,但我仍然不明白为什么堆栈中有数组,而堆上有动态分配?但是谢谢,问题解决了@查尔斯C++默认为在堆栈上本地声明的变量。如果需要动态内存,可以在堆上分配,但指向内存的指针在堆栈上。这就是C++中的方法。code>vector
s从堆内部分配内存,而数组本质上是在堆栈上分配的(这就是为什么它们的大小必须在编译时给定)。@hnefatl:不是数组在堆栈上,而是局部变量(只有它们的静态足迹!)。@hnefatl:
new int[2]
在堆上生成数组<编码>矢量foo(2)将
foo
放在堆栈上,但
int
s仍在堆上。这有用吗?有用,但建议不好。没有必要为此走向全球
static
会更好,但是
vector
vector
可以轻松完成任务。@user4581301做同样的事情有多种方法。考虑所有的选择并不是一个坏主意。我可以通过砍掉我的腿来杀死我脚上的疣。这不值得考虑。