2010-11-24 14 views
5

このコードは100要素の配列を作成し、それぞれの値をfalseに設定します。動的配列のデフォルト値を設定する

bool boolArray[100] = false; 

ダイナミックアレイのデフォルト値を設定するにはどうすればよいですか?

void Foo(int size) 
{ 
    bool boolArray = new bool[size]; 
    //Now what? 
} 
+1

それは 'ブール値です* boolArray'、ない'ブールboolArray'(それは1つだけになりますブールなので、「新しいもの」の割り当ては意味をなさないでしょう)。 – ThiefMaster

+0

最初の行は '... = {false};' –

答えて

11

かどうか

bool foo(int size) 
{ 
    bool* boolArray = new bool[size]();  // Zero-initialized 

    // Check that it is indeed zero-initialized: 
    for(int i = 0; i < size; ++i) 
    { 
     if(boolArray[i]) { delete[] boolArray; return false; } 
    } 
    delete[] boolArray; return true; 
} 

#include <iostream> 
int main() 
{ 
    using namespace std; 
    cout << (foo(42)? "OK" : "Ungood compiler") << endl; 
} 

をごコンパイラは正しいことを受け入れるか、さえすることは別の問題です。

ので、実際には、場合は、生の配列を使用するための魅力的な衝動を感じ、そしておそらくより良いstd::fillまたはそのようないくつかの、あるいは生のループを使用します。

ただし、繰り返されるdelete[]の表現に注意してください。このような冗長なコードは非常に簡単に間違っています:それはEvil ™です。また、生の配列の使用に間違っていることがあるので、初心者としては生の配列や生ポインタなどにはNo ™と言ってください。

代わりに、–の割り当て、初期化、コピー、および割り当て解除を正しく管理する標準ライブラリコンテナを使用してください。しかしそれには少し問題があります。すなわち、早急に最適化するstd::vector<bool>で、それ以外は自然な選択です。本質的にstd::vector<bool>は、1つの値につき1ビットしか使用しないので、bool要素への参照を渡すことはできませんが、代わりに代理オブジェクト&hellip;

したがって、bool要素の場合、 std::bitset(コンパイル時にサイズが分かっている場合)、または例えば。 std::deque、次のように:

#include <deque> 

bool foo(int size) 
{ 
    std::deque<bool> boolArray(size);  // Zero-initialized 

    for(int i = 0; i < size; ++i) 
    { 
     if(boolArray[i]) { return false; } 
    } 
    return true; 
} 

#include <iostream> 
int main() 
{ 
    using namespace std; 
    cout << (foo(42)? "OK" : "Ungood compiler") << endl; 
} 

乾杯& HTHを、

2
bool* boolArray = new bool[size]; 
for(int i = 0; i < size; i++) { 
    boolArray[i] = false; 
} 
+0

+1:Mehrdadのstd :: fillの提案(+ 1-ed)と同じように「エレガント」ではありませんが、基本的で再利用可能なものは、 、不確実なときに到達する生産的なアプローチ。 –

11

使用std::fill functionまたはstd::fill_n function

std::fill_n(boolArray, length, defaultValue); 
std::fill(boolArray, boolArray + length, defaultValue); 

サイドノート:代わりにstd::vectorを使用してみてください。また、結果を確認し、配列割当てを解除

bool* boolArray = new bool[size]();  // Zero-initialized 

完全なプログラム:あなたは、その配列を含め、何でもデフォルトに初期化することができ++標準Cでは

+0

このために 'std :: vector'を使うにはいくつか問題があります。私の答えを見てください。また、 'std :: fill'を使うことは、OPの問題の一般化にとっては確かに良い解決策ですが、手元の特定の問題には必ずしも必要ではありません。もう一度、私の答えを見てください。乾杯&乾杯。、 –

0

何について:。

void Foo(int size) 
{ 
    // bool boolArray = new bool[size]; 
    // Did you mean bool*? 
    // Try and avoid direct allocation of memory. 
    // Memory allocation should be done inside an object that 
    // actively manages it. 

    // Normally I would recommend a vector 
    std::vector<bool> boolArray(size, false); 

    // But. And a Big but. Is that the standards committee decided to 
    // specialize the vector for bool so that each element only takes 
    // a single bit. Unfortunately this had some side effects that were 
    // made its use not perfect (time/assign-ability). 

    // So we can try a boost array 
    boost::array<bool, size> boolArray; 
} 
+0

Uhm、ちょうどニット、あなたはランタイム 'size'をテンプレート引数として使うことはできません(私がこれを書いているようにコードのように)。おそらくブーストには実行時のサイズを許す配列がありますか?私は答えて 'std :: queue'に着いたが、誰もが別の好みを持っていた...乾杯、 –

+0

ええ、typo、私は' std :: deque'に答えた...とにかく、あなたのコードは 'boost :: array '( 'size'は実行時の値)でコンパイルされません。乾杯&乾杯。 –

関連する問題