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++.
Задание
ЛегкоCreate программу, которая демонстрирует range-based for loop, обрабатывая коллекцию названий городов и отображая them с количеством characters.
Будут предоставлены следующие входные данные:
- Целое число
n, представляющее number городов - Затем
nстрок, представляющих названия городов
Ваша программа должна:
- Create
std::vector<std::string>с именемcities - Использовать
push_back(), чтобы добавить each изnназваний городов в вектор - Использовать range-based for loop, чтобы iterate through вектор
- Для каждого города в loop напечатать название города, за которым следует его длина, using метод
.length() - 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;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Указатели и память
Что такое указатель?Оператор взятия адресаОператор разыменованияНулевые указателиУказатели и массивыДинамическая память и 'new'Освобождение памяти и 'delete'Итоги: Практика с указателями2Векторы (динамические массивы)
Знакомство с std::vectorСоздание вектораДобавление элементовДоступ к элементамРазмер вектораИтерация с помощью цикла ForRange-based цикл ForУдаление элементовИтоги: операции с векторами5Проект: Инструмент инвентаризации
Настройка проектаДобавление и обновление товаровПотренируйтесь самостоятельно: Онлайн-компилятор C++