Як працює діапазон для роботи для звичайних масивів?
Чи читати це як: " Скажи мені, що робить діапазон (з масивами)? "
Я відповім, припускаючи, що - Візьмемо такий приклад, використовуючи вкладені масиви:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (auto &pl : ia)
Текстова версія:
ia
є масивом масивів ("вкладений масив"), що містить [3]
масиви, кожен з яких містить [4]
значення. Наведений вище приклад прокручується за ia
допомогою його основного 'діапазону' ( [3]
), а отже, цикли циклу [3]
. Кожен контур виробляє один з ia
«S [3]
первинних значень , починаючи з першої і закінчуючи останньою - масив , що містить [4]
значення.
- Перший цикл:
pl
дорівнює {1,2,3,4}
- масив
- Другий цикл:
pl
дорівнює {5,6,7,8}
- масив
- Третій цикл:
pl
дорівнює {9,10,11,12}
- масив
Перш ніж ми пояснимо процес, ось кілька дружніх нагадувань про масиви:
- Масиви інтерпретуються як покажчики на їх перше значення - Використання масиву без будь-якої ітерації повертає адресу першого значення
pl
має бути посиланням, оскільки ми не можемо копіювати масиви
- З масивами, при додаванні номера на самому об'єкт масиву, він просувається вперед , що багато разів і «точка» до еквівалентної записи - Якщо
n
це число в питанні, то ia[n]
є такий самий , як *(ia+n)
(ми розіменування - адреси, n
записи вперед), і ia+n
таке саме, як &ia[n]
(Ми отримуємо адресу цього запису в масиві).
Ось що відбувається:
- Для кожного циклу
pl
встановлюється посилання на ia[n]
, з n
рівним поточному рахунку циклу, починаючи з 0. Отже, pl
знаходиться ia[0]
в першому раунді, у другому - це ia[1]
і так далі. Він отримує значення за допомогою ітерації.
- Цикл триває до тих пір,
ia+n
поки менше ніж end(ia)
.
... І все про це.
Це насправді просто спрощений спосіб написати це :
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int n = 0; n != 3; ++n)
auto &pl = ia[n];
Якщо ваш масив не вкладений, тоді цей процес стає дещо простішим, оскільки посилання не потрібне, оскільки ітераційне значення є не масивом, а скоріше "звичайним" значенням:
int ib[3] = {1,2,3};
for (auto pl : ib)
cout << pl;
for (int n = 0; n != 3; ++n)
cout << ib[n];
Деякі додаткові відомості
Що робити, якщо ми не хотіли використовувати auto
ключове слово під час створення pl
? Як би це виглядало?
У наступному прикладі pl
посилається на array of four integers
. На кожному циклі pl
дається значення ia[n]
:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int (&pl)[4] : ia)
І ... Ось як це працює, з додатковою інформацією, щоб усунути будь-яку плутанину. Це просто «скорочений» for
цикл, який автоматично підраховує вас, але не має способу отримати поточний цикл, не роблячи цього вручну.
for
. Але в той момент, коли масив перетворюється на покажчик, інформація про розмір втрачається.