Урок №95. Цикл foreach

  Юрій  | 

  Оновл. 13 Січ 2021  | 

 61

На цьому уроці ми розглянемо використання циклу foreach в мові С++.

Цикл foreach

На уроці про масиви і цикли ми розглядали приклади використання циклу for для здійснення ітерації по кожному елементу масиву. Наприклад:

У той час як цикли for надають зручний і гнучкий спосіб ітерації по масиву, в них так само легко можна заплутатися і наробити «помилок неврахованих одиниць».

Тому в C++11 додали новий тип циклу — foreach (або «цикл діапазону»), який надає простіший і безпечніший спосіб ітерації по масиву (або по будь-якій іншій структурі типу списка).

Синтаксис цикла foreach наступний:

for (оголошення_елемента: масив)
   стейтмент;

Виконується ітерація по кожному елементу масиву, присвоюючи значення поточного елементу масиву змінній, оголошеній як елемент (оголошення_елемента). З метою поліпшення продуктивності оголошений елемент повинен бути того ж типу, що й елементи масиву, інакше станеться неявна конвертація. Розглянемо простий приклад використання циклу foreach для виведення всіх елементів масиву math на екран:

Результат виконання програми:

0 1 4 5 7 8 10 12 15 17 30 41

Розглянемо детально, як це все працює. При виконанні циклу foreach змінній number присвоюється значення першого елементу (тобто значення 0). Далі програма виконує стейтмент виведення значення змінної number, тобто нуля. Потім цикл виконується знову, і значенням змінної number вже є 1 (другий елемент масиву). Виведення значення number виконується знову. Цикл продовжує своє виконання до тих пір, поки в масиві не залишиться непройдених елементів. В кінці виконання програма повертає 0 назад в операційну систему за допомогою оператора return.

Зверніть увагу, змінна number не є індексом масиву. Їй просто присвоюється значення елементу масиву в поточній ітерації циклу.

Цикл foreach і ключеве слово auto

Оскільки оголошений елемент циклу foreach повинен бути того ж типу, що й елементи масиву, то це ідеальний випадок для використання ключового слова auto, коли ми дозволяємо C++ вирахувати тип даних елементів масиву замість нас. Наприклад:

Цикл foreach і посилання

У прикладах, наведених вище, оголошений елемент завжди є змінною:

Тобто кожний опрацьований елемент масиву копіюється в змінну element, а це копіювання може виявитися витратним. В більшості випадків ми можемо просто посилатися на вихідний елемент за допомогою посилання:

У прикладі, наведеному вище, в якості оголошеного елементу цикла foreach використовується посилання на поточний елемент масиву, при цьому копіювання цього елементу не відбувається. Але, вказуючи звичайне посилання, будь-які зміни елементу будуть впливати на сам масив, що не завжди бажано.

Звичайно ж, хорошою ідеєю буде зробити оголошений елемент константою, тоді ви зможете його використовувати в режимі «тільки для читання»:

Правило: Використовуйте звичайні посилання або константні посилання в якості оголошеного елементу в циклі foreach (в цілях поліпшення продуктивності).

Ще один приклад

Ось приклад першої програми з початку цього уроку, але вже з використанням циклу foreach:

Зверніть увагу, тут нам вже не потрібно вручну прописувати індексацію масиву. Ми можемо отримати доступ до кожного елементу масиву безпосередньо через змінну score.

Цикл foreach і не масиви

Цикли foreach працюють не тільки з фіксованими масивами, але також і з багатьма іншими структурами: вектори (наприклад, std::vector), зв’язані списки, дерева, тощо. Не турбуйтеся, якщо ви не знаєте, що це таке, просто пам’ятайте, що цикли foreach забезпечують гнучкий і зручний спосіб ітерації не тільки по масивах:

Цикл foreach не працює з вказівниками на масив

Для ітерації по масиву, цикл foreach повинен знати довжину масиву. Оскільки масиви, які конвертуються у вказівник, не знають своєї довжини, то цикли foreach з ними працювати не можуть!

З цієї ж причини цикли foreach не працюють з динамічними масивами.

Чи можна отримати індекс поточного елементу?

Цикли foreach не пропонують прямий спосіб отримання індексу поточного елементу масиву. Це пов’язано з тим, що більшість структур, з якими можуть використовуватися цикли foreach (наприклад, зв’язані списки), напряму не індексуються!

Висновки

Цикли foreach забезпечують кращий синтаксис для ітерації по масиву, коли нам потрібно отримати доступ до всіх елементів масиву в послідовному порядку. Ці цикли краще використовувати замість стандартних циклів for в тих випадках, коли вони (цикли foreach) можуть використовуватися. Для запобігання створенню копій кожного елементу, в якості оголошеного елемента слід використовувати посилання.

Тест

Це повинно бути легко!

Оголосіть фіксований масив з наступними іменами: Sasha, Ivan, John, Orlando, Leonardo, Nina, Anton і Molly. Попросіть користувача ввести ім’я. Використовуйте цикл foreach для перевірки того, чи не знаходиться ім’я, введене користувачем, в масиві.

Приклад результату виконання програми:

Enter a name: Sasha
Sasha was found.

Enter a name: Maruna
Maruna was not found.

Підказка: Використовуйте std::string в якості типу масива.

Відповідь

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (1 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *