C ++ 11 перебрать неровный массив?

Я пытаюсь инициализировать зубчатый массив.
Почему это не работает:

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

он работает, но тогда arr не читается.

Как я могу правильно использовать эту форму «для» в этой ситуации?

Иначе как я могу просто инициализировать неровный массив из X строк, каждая строка состоит из Y элементов и установить все в ноль?

1

Решение

Пытаться:

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

Поскольку вы изменяете значение в массиве внутри цикла, вам нужно перебирать ссылки вместо значений (которые являются только копиями того, что было в массиве). Это очень похоже на семантику вызова функции.

6

Другие решения

for(auto&row:arr)      // note the &. also note the auto
row = new int[10];

компиляторы должны действительно предупреждать об этой глупой ошибке. Случалось со мной много раз.

1

Предоставленный Filmor ответ является правильным, но, как другие уже заявили в комментариях: если вы действительно хотите изучать C ++ 11, вам следует использовать такой контейнер, как std::vector,

Например:

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

И вы сделали. Вы можете добавить как можно больше intS, как вам нравится. Если вы хотите иметь список динамических int-списков фиксированного размера, рассмотрите возможность использования std::array:

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

Хотя я бы всегда рекомендовал использовать std::vector если производительность или память не проблема. Вы должны убедиться, что вы не превышаете максимальное количество элементов в любом случае.

Касательно forя бы всегда пытался использовать это так:

for (auto &item : list)

Если вы не хотите изменять список, добавьте const:

for (const auto &item : list)

Даже если вы не хотите изменять список, вы не будете делать копии по мере его продвижения.

0
По вопросам рекламы [email protected]