C ++で2D配列をゼロにするにはどうすればよいですか?そのためだけに2つのforループが必要ですか?
他の高等言語から来ているのに、なぜC ++が配列を意味のある/賢明なデフォルトに初期化しないのだろうか?常に配列を宣言し、その直後に「ゼロ」にする必要がありますか?
C ++言語は、「使用しないものに対して料金を支払わない」という原則に従おうとします。基本型をデフォルト値に初期化することはありません。これは、発生させたくない場合があるためです。いずれにせよ、言語はそのような初期化を明示的に要求する機会を提供します。
宣言の時点で、初期化子を使用してこれを行うことができます
int array[10][20] = {};
または、動的に割り当てられたアレイの場合
int (*array)[20] = new int[10][20]();
これにより、ゼロで初期化された配列が得られます。ループは必要ありません。
ただし、既存の配列をゼロにしたい場合は、実際にはもっと手の込んだものを使用する必要があります。整数型の場合、古き良きものmemset
が機能します。ポインタ型または浮動小数点型の場合、状況は一般的にもっと複雑です。memset
実装で定義されたプロパティに応じて、機能する場合と機能しない場合があります。いずれの場合も、標準ライブラリは、などのループラッパーを提供することにより、明示的なループの数を減らすのに役立ちますstd::fill
。
作成方法によって異なります。
2次元ベクトル、はい、2つのforループ(整数はプリミティブ型であるため、クラスはデフォルトのctorを呼び出します)。
二次元配列?いいえ、またはを使用しているかどうかに関係なく、メモリはすべて連続しているため、実行することも、一度memset
に実行することもできます。bzero
malloc
new
memset
どこにでもゼロを配置するために使用できます。ここに文書化
memset(pointer, value_to_put, num_bytes);
したがって、この場合、次のようなものがあります。
memset(myArray, 0, sizeof(arrayElement) * width * height);
スカラー型のCスタイルの配列のみが、初期化なしで作成されるオプションを持っています。このような配列をゼロに初期化するには、空の初期化子を指定するだけです。
int a[3][3] = {}; // 3x3 zeroes
「他の高等言語」から来ているので、2Dデータの低レベルタイプを少なくすることを検討してください(複数のマトリックスライブラリがあります:おそらく最も人気のあるboost.ublasとEigen、そしてもちろん、boostにはマルチ配列もあります)。