用C ++创建大小为66000 X 66000的二维数组

时间:2015-09-12 03:01:01

标签: c++ arrays c++11

我正在尝试在类中创建一个C ++大小为66000 X 66000的图形邻接列表,所以我不能使用C ++ 11自动功能来创建数组。此外,当我尝试int * array = new int [66000 * 66000],这是我在另一个堆栈溢出中看到的东西将它放在堆上时,我得到一个整数溢出错误。有没有办法可以创建这样大小的数组?谢谢。

4 个答案:

答案 0 :(得分:4)

让我们说所有这些66000 * 66000都是int s,然后消耗大约66000 * 66000 * 4/2 ^ 30 = 16G内存。你真的想这样做吗?

答案 1 :(得分:4)

您提到的溢出是因为66000 * 66000在我们的案例中不适合int

如果拥有如此庞大的阵列是一个好主意,这是值得怀疑的。但如果您愿意,可以尝试 long long

int *array = new int[66000LL * 66000];

虽然它可能超过了系统上允许的最大阵列大小,但请参阅例如Compiler Error C2148

同样,您可以尝试使用malloc。但即使使用char代替int(这应该足够用于邻接),也要准备好看到相当无响应的系统。

答案 2 :(得分:1)

由于您正在构建图形邻接列表,我猜测:

  1. 每个元素的值将为1(由边连接的节点)或0(未通过边连接的节点),
  2. 数组将是“稀疏的”(意味着,数组中的大多数值将为0)和
  3. 除非您正在使用定向图
  4. ,否则数组也将是对称的

    因此,不是将邻接信息存储为2D数组,而是通过存储数组的“仅1”来节省空间,例如:作为(x,y)对的列表。

    有关详细信息,请参阅:

答案 3 :(得分:1)

另一种方法是将邻接矩阵存储为位图,因为每个值都是0或1.这将具有节省空间的优点,并且缺点是使得提取关于连接性的信息更加复杂。一对节点。

这样的位图将占用66000 * 66000位,或544500000字节,或大约519.3Mb。您可以将其存储在bitsetC++ STL中的一部分)。