Menu
Coddy logo textTech

Range-based цикл For

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

Хотя традиционные циклы for с индексами хорошо подходят, чтобы iterate through vector, C++ предлагает более элегантное решение: range-based цикл for. Этот современный синтаксис устраняет необходимость вручную управлять индексами и делает ваш код более чистым и лёгким для чтения.

Цикл for на основе диапазона автоматически обрабатывает детали итерации за вас. Вместо управления индексной переменной вы просто указываете, что нужно сделать с каждым элементом:

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

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

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

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

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

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

challenge icon

Задание

Легко

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

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

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

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

  1. Create std::vector<std::string> с именем cities
  2. Использовать push_back(), чтобы добавить each из n названий городов в вектор
  3. Использовать range-based for loop, чтобы iterate through вектор
  4. Для каждого города в loop напечатать название города, за которым следует его длина, using метод .length()
  5. After loop напечатать total number обработанных городов, using метод .size() вектора

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

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

Range-based for loop должен использовать синтаксис for (const std::string& city : cities), чтобы iterate through каждый элемент вектора. Используйте city.length(), чтобы получить number characters в каждом названии города.

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

#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: Напишите ваш код ниже
    // Используйте range-based for цикл для итерации по вектору cities
    // Выведите каждый город с его длиной, используя указанный формат
    // After the loop, print the total number of cities processed
    
    return 0;
}
quiz iconПроверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор C++