我试图在主函数之外声明大小为100001x100001的二维数组,但是我得到“数组的大小太大”。 我该怎么办? 我的代码如何在C++中声明尺寸为100001x100001的主体之外的二维数组?
bool connected[100001][100001];
main()
{
...
}
我试图在主函数之外声明大小为100001x100001的二维数组,但是我得到“数组的大小太大”。 我该怎么办? 我的代码如何在C++中声明尺寸为100001x100001的主体之外的二维数组?
bool connected[100001][100001];
main()
{
...
}
您可能需要使用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;
}
你将不得不使用位操作访问相应的列。
谢谢你的建议,我用矢量解决了这个问题。我使用了矢量
你确定你想要一个'int'的矢量吗?大多数系统上的“int”大于8位。我们假设你的机器上的sizeof(int)是32位(4字节)。您正在分配100001 * 4个字节。这是足够的位(或字节)?顺便说一句,你应该在使用位时使用** unsigned int **。大多数平台预留1位来指示整数是否被签名。所以你通过使用带符号整数失去100001位。 – 2014-10-22 00:58:06
实际上我使用二维数组作为连通矩阵来解决基于图的问题。所以,我从邻接矩阵变成了向量中表示的邻接列表:) – 2014-10-22 01:03:10
您的系统能够处理9GB内存吗? – 2014-10-22 00:10:34
@vsoftco这是不可能/可能有堆栈的大小 – 2014-10-22 00:11:41
@BryanChen真,我计算出的大小为0.1Gb而不是10Gb :)删除评论。 – vsoftco 2014-10-22 00:17:46