Я пытаюсь инициализировать зубчатый массив.
Почему это не работает:
int *arr[10];
for (int *row : arr)
row = new int[10];
он работает, но тогда arr не читается.
Как я могу правильно использовать эту форму «для» в этой ситуации?
Иначе как я могу просто инициализировать неровный массив из X строк, каждая строка состоит из Y элементов и установить все в ноль?
Пытаться:
int* arr[10];
for (int*& row : arr)
row = new int[10];
Поскольку вы изменяете значение в массиве внутри цикла, вам нужно перебирать ссылки вместо значений (которые являются только копиями того, что было в массиве). Это очень похоже на семантику вызова функции.
for(auto&row:arr) // note the &. also note the auto
row = new int[10];
компиляторы должны действительно предупреждать об этой глупой ошибке. Случалось со мной много раз.
Предоставленный Filmor ответ является правильным, но, как другие уже заявили в комментариях: если вы действительно хотите изучать C ++ 11, вам следует использовать такой контейнер, как std::vector
,
Например:
std::vector<std::vector<int>> list;
И вы сделали. Вы можете добавить как можно больше int
S, как вам нравится. Если вы хотите иметь список динамических int-списков фиксированного размера, рассмотрите возможность использования std::array
:
std::array<std::vector<int>, 10> arr;
Хотя я бы всегда рекомендовал использовать std::vector
если производительность или память не проблема. Вы должны убедиться, что вы не превышаете максимальное количество элементов в любом случае.
Касательно for
я бы всегда пытался использовать это так:
for (auto &item : list)
Если вы не хотите изменять список, добавьте const
:
for (const auto &item : list)
Даже если вы не хотите изменять список, вы не будете делать копии по мере его продвижения.