1

ジャグ配列を初期化しようとしています。これが機能しない理由:

int *arr[10];
for (int *row : arr)
    row = new int[10];

実行されますが、 arr は読み取れません。

この状況でこの形式の「for」を適切に使用するにはどうすればよいですか?

それ以外の場合は、X 行のギザギザの配列を初期化し、各行を Y 要素にして、すべてゼロに設定するにはどうすればよいですか?

4

3 に答える 3

6

試す:

int* arr[10];
for (int*& row : arr)
    row = new int[10];

ループ内の配列の値を変更しているため、値の代わりに参照を反復処理する必要があります (これは配列にあったもののコピーにすぎません)。これは、関数呼び出しのセマンティクスに非常に似ています。

于 2013-04-29T11:28:38.290 に答える
0

filmor によって提供された回答は正しいですが、他の人がコメントで既に述べているように: 本当に C++11 を学びたい場合は、std::vector.

例えば:

std::vector<std::vector<int>> list;

これで完了です。sはいくつでも追加できintます。動的な int リストの固定サイズのリストが必要な場合は、次の使用を検討してstd::arrayください。

std::array<std::vector<int>, 10> arr;

std::vectorただし、パフォーマンスやメモリが問題にならない場合は、常に使用することをお勧めします。とにかく、要素の最大数を超えていないことを確認する必要があります。

-loopに関してはfor、私は常に次のように使用しようとします。

for (auto &item : list)

リストを変更したくない場合は、次を追加しconstます。

for (const auto &item : list)

リストを変更したくない場合でも、リストを進めながらコピーを作成しているわけではありません。

于 2013-04-29T12:34:34.490 に答える