C ++中的动态bool数组

时间:2011-04-14 19:24:02

标签: c++ arrays dynamic boolean

// All right? This is really good working code? 
//Need init array with value "false"

bool **Madj;
int NodeCount=4;

bool **Madj = new bool*[NodeCount];
for (int i=0; i<NodeCount; i++){
    Madj[i] = new bool [NodeCount];
    for (int j=0; j<NodeCount; j++){
        Madj[i][j] = false;
    }
}

6 个答案:

答案 0 :(得分:4)

你可以考虑使用Boost的内置multi-dimensional array作为一种不那么脆弱的选择。如上所述,您提供的代码可以使用,但有问题。

答案 1 :(得分:3)

至少IMO,如果你坚持这样做,你通常应该采用相反的方式,例如:

class bool_array { 
     bool *data_;
     size_t width_;

     // no assignment or copying
     bool_array &operator=();
     bool_array(bool_array const &);
public:
     bool_array(size_t x, size_t y) width_(x) {
         data_ = new bool[x*y];
         std::fill_n(data_, x*y, false);
     }

     bool &operator()(size_t x, size_t y) { 
         return data_[y+width_+x];
     }

     ~bool_array() { delete [] data_; }
};

这可以修饰(例如,使用代理来强制执行constness),但总的想法仍然是:1)在一个块中分配你的bool,并且2)将它们放入一个类中,3重载操作符以支持合理清理索引到数据中。

您还应该考虑使用std::vector<bool>。与std::vector的其他实例化不同,它不是容器(因为标准定义了该术语),这可能令人困惑 - 但您创建的内容也不是容器,因此显然无关紧要你。

答案 2 :(得分:3)

怎么样:

std::vector<std::vector<bool> >   Madj(4,std:vector<bool>(4, false));

不幸的是std :: vector&lt; bool&gt;专门针对尺寸(而非速度)进行优化 所以它可能效率低下(特别是如果经常使用的话)。所以你可以使用一个int数组(如果你发现bool版本正在减慢你的速度)。

std::vector<std::vector<int> >   Madj(4,std:vector<int>(4, 0));

注意:int可以在布尔上下文中使用并自动转换(0 =&gt; false,任何其他数字都为真(尽管最好使用1)。

答案 3 :(得分:1)

bool **Madj = new bool*[NodeCount];
for (int i=0; i<NodeCount; i++){
    Madj[i] = new bool [NodeCount];
    for (int j=0; j<NodeCount; j++){
        Madj[i][j] = false;
    }
}

如果对new的第一次调用成功,但循环中的任何一次调用失败,那么自Madj以来就会出现内存泄漏,并且不会删除直到当前i的子数组。使用vector<vector<bool> >vector<bool>大小NodeCount * NodeCount。使用后一个选项,您可以使用i获取元素(j[i*NodeCount+j])。

答案 4 :(得分:0)

我觉得这很好看!

根据用途,您可以使用std :: vector而不是原始数组。

但确实第一个Madj声明应该是“extern”以避免链接或阴影错误。

答案 5 :(得分:0)

如果您只有bool,请考虑使用bitset s。您可以将其与其他容器组合用于多维数组,例如vector<bitset>