// 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;
}
}
答案 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>
。