このコードは100要素の配列を作成し、それぞれの値をfalseに設定します。動的配列のデフォルト値を設定する
bool boolArray[100] = false;
ダイナミックアレイのデフォルト値を設定するにはどうすればよいですか?
void Foo(int size)
{
bool boolArray = new bool[size];
//Now what?
}
このコードは100要素の配列を作成し、それぞれの値をfalseに設定します。動的配列のデフォルト値を設定する
bool boolArray[100] = false;
ダイナミックアレイのデフォルト値を設定するにはどうすればよいですか?
void Foo(int size)
{
bool boolArray = new bool[size];
//Now what?
}
かどうか
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を、
bool* boolArray = new bool[size];
for(int i = 0; i < size; i++) {
boolArray[i] = false;
}
+1:Mehrdadのstd :: fillの提案(+ 1-ed)と同じように「エレガント」ではありませんが、基本的で再利用可能なものは、 、不確実なときに到達する生産的なアプローチ。 –
使用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では
このために 'std :: vector'を使うにはいくつか問題があります。私の答えを見てください。また、 'std :: fill'を使うことは、OPの問題の一般化にとっては確かに良い解決策ですが、手元の特定の問題には必ずしも必要ではありません。もう一度、私の答えを見てください。乾杯&乾杯。、 –
何について:。
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;
}
Uhm、ちょうどニット、あなたはランタイム 'size'をテンプレート引数として使うことはできません(私がこれを書いているようにコードのように)。おそらくブーストには実行時のサイズを許す配列がありますか?私は答えて 'std :: queue'に着いたが、誰もが別の好みを持っていた...乾杯、 –
ええ、typo、私は' std :: deque'に答えた...とにかく、あなたのコードは 'boost :: array
それは 'ブール値です* boolArray'、ない'ブールboolArray'(それは1つだけになりますブールなので、「新しいもの」の割り当ては意味をなさないでしょう)。 – ThiefMaster
最初の行は '... = {false};' –