C++ 如何创建C++;大小为40000的布尔2D阵列?

C++ 如何创建C++;大小为40000的布尔2D阵列?,c++,multidimensional-array,matrix,C++,Multidimensional Array,Matrix,我想制作一个名为connectionsOf的布尔矩阵,大小可达40000。这是我的密码: int index = 40000; bool connectionsOf[index][index]; 然而,当我在一个有37000个数字的文件上运行它来填充矩阵时,有一个分段错误。 在stackoverflow上浏览时,我发现这是因为索引号太高,导致堆栈崩溃。 有没有办法让这个堆栈成为可能?例如静态、常量、动态、指针?如果是这样,我应该用什么替换代码?您应该能够通过编译器标志设置堆栈大小。您应该能够通

我想制作一个名为
connectionsOf
的布尔矩阵,大小可达40000。这是我的密码:

int index = 40000;
bool connectionsOf[index][index];
然而,当我在一个有37000个数字的文件上运行它来填充矩阵时,有一个分段错误。 在stackoverflow上浏览时,我发现这是因为索引号太高,导致堆栈崩溃。
有没有办法让这个堆栈成为可能?例如静态、常量、动态、指针?如果是这样,我应该用什么替换代码?

您应该能够通过编译器标志设置堆栈大小。

您应该能够通过编译器标志设置堆栈大小。

您的问题的答案取决于您使用的编译器。 对于gcc,请参见此。 但为什么需要在堆栈而不是堆上分配如此大的数据块呢?
顺便说一句,您需要分配200x200数组以获得40000个项目(200^2)。

问题的答案取决于您使用的编译器。 对于gcc,请参见此。 但为什么需要在堆栈而不是堆上分配如此大的数据块呢?
顺便说一句,您需要分配200x200数组来获得40000个项目(200^2)。

您滥用了堆栈。40'000 x 40'000 x尺寸(bool)=(至少)800'000'000。这太多了(单个块中有800MB)

尝试:

index=40000;
bool**connections=新bool*[索引];
对于(int t=0;t

也要确保适当地处理它(与上面相同,只需反向-首先迭代并处理数组元素,然后处理表本身)

您正在滥用堆栈。40'000 x 40'000 x尺寸(bool)=(至少)800'000'000。这太多了(单个块中有800MB)

尝试:

index=40000;
bool**connections=新bool*[索引];
对于(int t=0;t

也要确保适当地处理它(与上面相同,只需反向-首先迭代并处理数组元素,然后处理表本身)

您可以通过编写一个包装器来模拟二维位数组(可能会节省一点内存)


如果您在编译时知道大小,还可以将此技术用于。

您可以通过编写包装器来模拟二维位数组(可能会节省一点内存)



如果您在编译时知道大小,也可以将此技术用于。

这不是大小为40000的数组;其(40000*40000)或160000000。只是稍微超出了你的可能的栈限制(这并不是C++编译的,因为它实际上是一个VLA)。@ WoZoCrigg:我想它会用GCC编译,作为GNU扩展。你需要动态分配内存,但是为什么你需要这么大的数字,你不能用块处理吗?或者你可以用一个带有位移位的int向量来使用。因此,在每个int中可以存储8个bool,使用var&0x00000001可以检查不是大小为40000的数组的位;其(40000*40000)或160000000。只是稍微超出了你的可能的栈限制(这并不是C++编译的,因为它实际上是一个VLA)。@ WoZoCrigg:我想它会用GCC编译,作为GNU扩展。你需要动态分配内存,但是为什么你需要这么大的数字,你不能用块处理吗?或者你可以用一个带有位移位的int向量来使用。因此,在每个int中可以存储8个bool,使用var&0x00000001可以检查位以澄清,它需要是40000x40000。我使用g++。好的,当你的代码正确时。那么,你看到我的链接了吗?它应该适用于
g++
。为了澄清,它需要是40000x40000。我使用g++。好的,当你的代码正确时。那么,你看到我的链接了吗?它应该适用于
g++
。它是2D数组,而不是1D。。我不太清楚您所说的disposing/when是什么意思,因为我需要在运行时使用用户输入访问矩阵。这里的“Dispose”意味着
new[]
分配的所有内容都必须通过
delete[]
进行解除分配。在删除外部数组之前,必须先删除内部数组。为什么人们会一遍又一遍地重复“二维数组”的“beeellions of
new
调用”的胡说八道……这是一个二维数组,而不是一维数组。。我不太清楚您所说的disposing/when是什么意思,因为我需要在运行时使用用户输入访问矩阵。这里的“Dispose”意味着
new[]
分配的所有内容都必须通过
delete[]
进行解除分配。在删除外部数组之前,您必须先删除内部数组。为什么人们会一遍又一遍地重复“二维数组”的“beeellions of
new
调用”的胡说八道……如何做到这一点?既然我的程序将在一台不同于我的计算机上进行测试,有没有一种方法可以从我的文件中进行测试?如何进行测试?由于我的程序将在不同于我的计算机上进行测试,有没有办法从我的文件中进行测试?有一个专门的
std::vector
(请参阅)实现了“动态大小的位集”。它可以用于此。有一个专门化的
std::vector
(请参阅),它实现了“动态大小的位集”。它可以用于此。
index = 40000;
bool** connections = new bool*[index];
for (int t = 0; t < index; ++t) {
    connections[t] = new bool[index];
}
class BitMatrix
{
public:
    BitMatrix (int size) : size_(size), bits_(size_ * size_) {}
    void set(int x, int y) { bits_.set(y * size_ + x); }
    bool test(int x, int y) { return bits_.test(y * size_ + x); }
private:
    int size_;
    boost::dynamic_bitset bits_;
};