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(), чтобы получить количество символов в названии каждого города.

Шпаргалка

Основанный на диапазоне цикл 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 предотвращает случайное изменение элемента внутри тела цикла
  • Работает с любым контейнером, который поддерживает итерацию

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

#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 на основе диапазона для итерации по вектору cities
    // Выведите каждый город с его длиной, используя указанный формат
    // После цикла выведите общее количество обработанных городов
    
    return 0;
}
quiz iconПроверьте себя

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

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