Як працює діапазон для роботи для звичайних масивів?
Чи читати це як: " Скажи мені, що робить діапазон (з масивами)? "
Я відповім, припускаючи, що - Візьмемо такий приклад, використовуючи вкладені масиви:
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. Але в той момент, коли масив перетворюється на покажчик, інформація про розмір втрачається.