如何创建一个大小为40000的c++ bool 2D数组



我想创建一个名为connectionsOf的bool矩阵,其大小可达40000。下面是我的代码:

int index = 40000;
bool connectionsOf[index][index];

然而,当我在一个有37000个数字的文件上运行它来填充矩阵时,出现了分割错误。在stackoverflow上浏览,我发现这是因为索引号太高了,它破坏了堆栈。有没有办法使这个堆栈成为可能呢?比如静态,const,动态,指针?如果是这样,我应该用什么来替换我的代码?

您可以通过编写boost::dynamic_bitset的包装器来模拟二维位数组(并且可能节省一些内存)。

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_;
};

如果您知道编译时的大小,您也可以在std::bitset中使用此技术。

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

你在滥用堆栈。40'000 × 40'000 × sizeof(bool) =(至少)800'000'000。太大了(单个块800MB)

试题:

index = 40000;
bool** connections = new bool*[index];
for (int t = 0; t < index; ++t) {
    connections[t] = new bool[index];
}

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

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

相关内容

  • 没有找到相关文章

最新更新