В стандарті мови С++ 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 << ' '; } |