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 ofnew
调用”的胡说八道……这是一个二维数组,而不是一维数组。。我不太清楚您所说的disposing/when是什么意思,因为我需要在运行时使用用户输入访问矩阵。这里的“Dispose”意味着new[]
分配的所有内容都必须通过delete[]
进行解除分配。在删除外部数组之前,您必须先删除内部数组。为什么人们会一遍又一遍地重复“二维数组”的“beeellions ofnew
调用”的胡说八道……如何做到这一点?既然我的程序将在一台不同于我的计算机上进行测试,有没有一种方法可以从我的文件中进行测试?如何进行测试?由于我的程序将在不同于我的计算机上进行测试,有没有办法从我的文件中进行测试?有一个专门的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_;
};