5

C ++で2D配列をゼロにするにはどうすればよいですか?そのためだけに2つのforループが必要ですか?

他の高等言語から来ているのに、なぜC ++が配列を意味のある/賢明なデフォルトに初期化しないのだろうか?常に配列を宣言し、その直後に「ゼロ」にする必要がありますか?

4

4 に答える 4

12

C ++言語は、「使用しないものに対して料金を支払わない」という原則に従おうとします。基本型をデフォルト値に初期化することはありません。これは、発生させたくない場合があるためです。いずれにせよ、言語はそのような初期化を明示的に要求する機会を提供します。

宣言の時点で、初期化子を使用してこれを行うことができます

int array[10][20] = {};

または、動的に割り当てられたアレイの場合

int (*array)[20] = new int[10][20]();

これにより、ゼロで初期化された配列が得られます。ループは必要ありません。

ただし、既存の配列をゼロにしたい場合は、実際にはもっと手の込んだものを使用する必要があります。整数型の場合、古き良きものmemsetが機能します。ポインタ型または浮動小数点型の場合、状況は一般的にもっと複雑です。memset実装で定義されたプロパティに応じて、機能する場合と機能しない場合があります。いずれの場合も、標準ライブラリは、などのループラッパーを提供することにより、明示的なループの数を減らすのに役立ちますstd::fill

于 2012-11-17T03:44:36.550 に答える
1

作成方法によって異なります。

2次元ベクトル、はい、2つのforループ(整数はプリミティブ型であるため、クラスはデフォルトのctorを呼び出します)。

二次元配列?いいえ、またはを使用しているかどうかに関係なく、メモリはすべて連続しているため、実行することも、一度memsetに実行することもできます。bzeromallocnew

于 2012-11-17T03:42:48.163 に答える
0

memsetどこにでもゼロを配置するために使用できます。ここに文書化

memset(pointer, value_to_put, num_bytes);

したがって、この場合、次のようなものがあります。

memset(myArray, 0, sizeof(arrayElement) * width * height);
于 2012-11-17T03:41:21.240 に答える
0

スカラー型のCスタイルの配列のみが、初期化なしで作成されるオプションを持っています。このような配列をゼロに初期化するには、空の初期化子を指定するだけです。

int a[3][3] = {}; // 3x3 zeroes

「他の高等言語」から来ているので、2Dデータの低レベルタイプを少なくすることを検討してください(複数のマトリックスライブラリがあります:おそらく最も人気のあるboost.ublasとEigen、そしてもちろん、boostにはマルチ配列もあります)。

于 2012-11-17T03:44:52.877 に答える