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