2014-10-22 26 views
-2

我试图在主函数之外声明大小为100001x100001的二维数组,但是我得到“数组的大小太大”。 我该怎么办? 我的代码如何在C++中声明尺寸为100001x100001的主体之外的二维数组?

bool connected[100001][100001]; 

main() 
{ 
    ... 
} 
+7

您的系统能够处理9GB内存吗? – 2014-10-22 00:10:34

+0

@vsoftco这是不可能/可能有堆栈的大小 – 2014-10-22 00:11:41

+0

@BryanChen真,我计算出的大小为0.1Gb而不是10Gb :)删除评论。 – vsoftco 2014-10-22 00:17:46

回答

2

您可能需要使用uint8_t,而不是布尔压缩该矩阵。

我们假设每个uint8_t有8个布尔值。 100001/8 = 12,500 所以在每一行中有12,500列。

声明将是:

uint8_t connections[100001][100001/8]; 

大多数编程环境,不会让你在声明全局区一个巨大的数组。您可能需要调整默认设置才能执行此操作。

另一种选择是使用动态分配:

int main(void) 
{ 
    const unsigned int allocation_size = 100001 * (100001/8); 
    uint8_t * connections = new uint8_t [allocation_size]; 
    // ... 
    delete[] connections; 
    return 0; 
} 

你将不得不使用位操作访问相应的列。

+0

谢谢你的建议,我用矢量解决了这个问题。我使用了矢量 v [100001],它的工作 – 2014-10-22 00:48:13

+0

你确定你想要一个'int'的矢量吗?大多数系统上的“int”大于8位。我们假设你的机器上的sizeof(int)是32位(4字节)。您正在分配100001 * 4个字节。这是足够的位(或字节)?顺便说一句,你应该在使用位时使用** unsigned int **。大多数平台预留1位来指示整数是否被签名。所以你通过使用带符号整数失去100001位。 – 2014-10-22 00:58:06

+0

实际上我使用二维数组作为连通矩阵来解决基于图的问题。所以,我从邻接矩阵变成了向量中表示的邻接列表:) – 2014-10-22 01:03:10