2013-04-29 2 views
1

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

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

он работает, но тогда обр неразборчивое.

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

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

+10

Хотя это не объясняет, почему это не сработает, для цели Finagle просто используйте 'std :: vector'. –

+6

У этого слишком много звезд, чтобы быть C++. –

ответ

6

Try:

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

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

+0

черт!, Я делал (int & * row: arr) вместо этого! должен был подумать о переключении заказа ... спасибо –

+4

Нет, вы должны были подумать о том, чтобы не использовать необработанные указатели и массивы C-стиля. –

+1

'int & * row' IIRC - это незаконный и бессмысленный указатель на ссылку на int. –

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

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

0

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

Например:

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

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

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

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

Что касается for -loop, я всегда стараюсь использовать его таким образом:

for (auto &item : list) 

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

for (const auto &item : list) 

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

+0

'auto const &', потому что 'const' лучше всего размещается в правой части для согласованности (его можно разместить только слева, для самого внешнего уровня, который ужасно запутан) –

+0

если мне все равно о производительности, я бы даже не использовал C++ вообще. –

+0

@MatthieuM.Я думаю, что это в основном вопрос вкуса и только ведет к бесконечным дискуссиям о том, что правильно и что не так. – Excelcius

Смежные вопросы