Menu
Coddy logo textTech

Range-based цикл For

Часть раздела Логика и управление потоком путешествия по C++ на Coddy — урок 15 из 56.

Хотя традиционные циклы for с индексами хорошо подходят для итерации по векторам, C++ предлагает более элегантное решение: цикл for на основе диапазона (range-based for loop). Этот современный синтаксис избавляет от необходимости ручного управления индексами и делает ваш код чище и понятнее.

Цикл for на основе диапазона (range-based for loop) автоматически обрабатывает детали итерации за вас. Вместо того чтобы управлять переменной индекса, вы просто указываете, что вы хотите сделать с каждым элементом:

std::vector<std::string> names = {"Alice", "Bob", "Charlie"};

for (const std::string& name : names) {
    std::cout << name << std::endl;
}

Этот цикл делает ровно то же самое, что и традиционный подход на основе индексов, но с гораздо более простым синтаксисом. Переменная name автоматически принимает значение каждого элемента вектора по очереди.

Вы можете заметить символ & в объявлении цикла — const std::string& name. В данном контексте & не означает «взятие адреса», как вы могли видеть ранее. Здесь он объявляет name как ссылку (псевдоним) непосредственно на каждый элемент вектора, вместо того чтобы создавать его копию. Представьте это как присвоение нового имени тому же фрагменту данных — подобно использованию указателя на элемент, но без необходимости разыменовывать его внутри тела цикла.

Ключевое слово const является мерой безопасности: оно предотвращает случайное изменение элемента через псевдоним внутри тела цикла. Сам псевдоним по-прежнему переходит к каждому новому элементу с каждой итерацией — именно содержимое, к которому вы обращаетесь через псевдоним, остается неизменным, а не ход цикла.

Цикл for на основе диапазона (range-based for loop) не только более читаем, но и безопаснее — нет риска ошибок индексации, так как вы не управляете индексами вручную. Он работает с любым контейнером, поддерживающим итерацию, что делает его универсальным инструментом для обработки коллекций данных в C++.

challenge icon

Задание

Легко

Создайте программу, которая демонстрирует работу цикла for на основе диапазона (range-based for loop), обрабатывая коллекцию названий городов и отображая их вместе с количеством символов в каждом названии.

Будут предоставлены следующие входные данные:

  • Целое число n, представляющее количество городов
  • Затем n строк, представляющих названия городов

Ваша программа должна:

  1. Создать std::vector<std::string> с именем cities
  2. Использовать push_back() для добавления каждого из n названий городов в вектор
  3. Использовать цикл for на основе диапазона для итерации по вектору
  4. Для каждого города в цикле вывести название города, а затем его длину, используя метод .length()
  5. После цикла вывести общее количество обработанных городов, используя метод вектора .size()

Используйте следующий точный формат вывода:

City: [city name] (Length: [number of characters])\nCity: [city name] (Length: [number of characters])\n...\nTotal cities processed: [total count]

Цикл for на основе диапазона должен использовать синтаксис for (const std::string& city : cities) для итерации по каждому элементу в векторе. Используйте city.length(), чтобы получить количество символов в названии каждого города.

Попробуйте сами

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
    // Считать количество городов
    int n;
    cin >> n;
    
    // Создать вектор для хранения названий городов
    vector<string> cities;
    
    // Считать названия городов и добавить их в вектор
    for (int i = 0; i < n; i++) {
        string city;
        cin >> city;
        cities.push_back(city);
    }
    
    // TODO: Напишите свой код ниже
    // Используйте цикл for на основе диапазона для итерации по вектору городов
    // Выведите каждый город с его длиной, используя указанный формат
    // После цикла выведите общее количество обработанных городов
    
    return 0;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком