C ++中的动态布尔数组

|
// 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;
    }
}
    
已邀请:
您可以考虑使用Boost \的内置多维数组作为不那么脆弱的替代方法。如前所述,您提供的代码可以使用,但是有问题。     
关于什么:
std::vector<std::vector<bool> >   Madj(4,std:vector<bool>(4, false));
不幸的是std :: vector 是专门针对大小(而不是速度)进行优化的。 因此它可能效率很低(尤其是经常使用的情况下)。因此,您可以使用int数组(如果发现bool版本正在使您减速)。
std::vector<std::vector<int> >   Madj(4,std:vector<int>(4, 0));
注意:int可以在布尔上下文中使用并自动转换(0 => false,其他任何数字均为true(尽管最好使用1)。     
至少,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_; }
};
可以修饰(例如,使用代理来实现常量性),但是总体思路仍然是:1)在一个块中分配您的in4ѭ,2)将它们放入类中,以及3)重载运算符以支持合理的清理索引到数据中。 您还应该考虑使用
std::vector<bool>
。与其他ѭ6实例化不同,它不是容器(按照标准定义该术语),这可能会造成混淆-但是您创建的内容也不是容器,因此显然无关紧要给你。     
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
的子数组不会被删除,因此您将发生内存泄漏。使用ѭ11或大小为
NodeCount * NodeCount
vector<bool>
。使用后一个选项,您可以使用
[i*NodeCount+j]
到达元素(
i
j
)。     
我认为这看起来不错! 根据用途,可以使用std :: vector而不是原始数组。 但是,第一个Madj声明应为\“ extern \”,以避免链接或阴影错误,这是正确的。     
如果只有
bool
,请考虑使用
bitset
。您可以将其与其他容器组合以用于多维数组,例如
vector<bitset>
。     

要回复问题请先登录注册