如何创建大小为40,000的C ++ bool 2D数组?

时间:2013-05-08 16:14:04

标签: c++ multidimensional-array matrix

我想创建一个名为connectionsOf的bool矩阵,大小最多为40 000.这是我的代码:

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

但是,当我在一个包含37000个数字的文件上运行它来填充矩阵时,会出现分段错误。 在stackoverflow上浏览,我发现它是因为索引号太高而不能打击堆栈。 有没有办法让这个堆栈成为可能?比如static,const,dynamic,pointers?如果是这样,我应该用什么代替我的代码?

4 个答案:

答案 0 :(得分:4)

您可以通过在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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

你正在滥用堆栈。 40' 000 x 40' 000 x 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];
}

一定要充分处理它(与上面相同,只需反向 - 首先迭代并处理数组元素,然后配置表本身)

答案 3 :(得分:0)

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