В стандарті мови С++ 11 (діє з 2011 року) з’явився новий вид циклу range-based for
або цикл for на основі діапазону
. Цей вид циклу призначений для перебору елементів колекцій, наприклад, масиву або контейнерів (vector
, string
та ін.).
Синтаксис циклу:
1 2 3 |
for (оголошення_елемента : ім'я_послідовності){ тіло_циклу } |
Наприклад, наступний код дозволяє вивести на екран елементи масива arr
:
1 2 3 4 |
int arr[]{ 2, 3, 5, 1, 0 }; for (int el : arr) { cout << el << ' '; } |
Тут el
– змінна, яка послідовно приймає значення від першого до останнього елементу масива arr
. Розмір масиву вказувати не потрібно, цикл ніколи не вийде за межі діапазону.
При кожній ітерації в змінну el
копіюється поточний елемент масиву, тому всі дії, які відбуваються зі змінною відбуваються з копіями елементів масиву, а не з самими елементами. Для зміни вихідного масиву необхідно використовувати посилальний тип даних для змінної el
.
Наприклад, наступний код змінить всі елементи масиву arr
на 0:
1 2 3 4 |
int arr[]{ 2, 3, 5, 1, 0 }; for (int &el : arr) { el = 0; } |
В цьому випадку замість копії елементу використовується посилання на сам елемент.
Використання посилального типу може бути корисним і при виведенні елементів для економії пам’яті та підвищення продуктивності, наприклад, якщо розмір елементу великий, то при використанні посилального типу, копіювання не відбувається. Але в цьому випадку є ймовірність випадково змінити масив. Щоб захистити елементи масиву від зміни необхідно зробити елемент константним. Наприклад:
1 2 3 4 |
int arr[]{ 2, 3, 5, 1, 0 }; for (const int &el : arr) { cout << el << ' '; } |