ジャグ配列を初期化しようとしています。これが機能しない理由:
int *arr[10];
for (int *row : arr)
row = new int[10];
実行されますが、 arr は読み取れません。
この状況でこの形式の「for」を適切に使用するにはどうすればよいですか?
それ以外の場合は、X 行のギザギザの配列を初期化し、各行を Y 要素にして、すべてゼロに設定するにはどうすればよいですか?
ジャグ配列を初期化しようとしています。これが機能しない理由:
int *arr[10];
for (int *row : arr)
row = new int[10];
実行されますが、 arr は読み取れません。
この状況でこの形式の「for」を適切に使用するにはどうすればよいですか?
それ以外の場合は、X 行のギザギザの配列を初期化し、各行を Y 要素にして、すべてゼロに設定するにはどうすればよいですか?
試す:
int* arr[10];
for (int*& row : arr)
row = new int[10];
ループ内の配列の値を変更しているため、値の代わりに参照を反復処理する必要があります (これは配列にあったもののコピーにすぎません)。これは、関数呼び出しのセマンティクスに非常に似ています。
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)
リストを変更したくない場合でも、リストを進めながらコピーを作成しているわけではありません。