Цикл for на основе диапазона с контейнерами
Удобно перебирайте контейнеры с помощью синтаксиса цикла for на основе диапазона из C++11.
«Цикл for на основе диапазона с контейнерами» — бесплатный урок C++ Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Современный цикл
В C++11 появился цикл for по диапазону — он позволяет обходить любой контейнер без явных индексов и итераторов. Такой код чище, и в нём сложнее допустить ошибку.
std::vector<int> v = {1, 2, 3, 4, 5};
for (int x : v) {
std::cout << x << " ";
}По значению
Приведённый выше пример копирует каждый элемент в x. Это нормально для недорогих типов, таких как int, но затратно для больших объектов.
По константной ссылке
Для нетривиальных типов используйте const auto&, чтобы избежать копирования и показать, что элементы не будут изменяться.
std::vector<std::string> names = {"Ada", "Bob"};
for (const auto& name : names) {
std::cout << name << "\n";
}По ссылке для изменения
Используйте обычную ссылку, чтобы изменять элементы на месте.
std::vector<int> v = {1, 2, 3};
for (auto& x : v) {
x *= 10;
}
// v is now {10, 20, 30}auto для вывода типа
Позвольте компилятору вывести тип элемента. Для строк, векторов структур и отображений это избавляет от большого количества ручного ввода.
Обход отображения
Каждый элемент представляет собой std::pair<const Key, Value>. Для более чистого кода используйте структурированное связывание (C++17).
std::map<std::string, int> ages = {{"Ada",30},{"Bob",24}};
for (const auto& [name, age] : ages) {
std::cout << name << ": " << age << "\n";
}Обход строк
std::string — это контейнер, содержащий объекты типа char.
std::string s = "hello";
for (char c : s) {
std::cout << c << " ";
}Циклы по списку инициализации
Можно напрямую выполнить обход списка, заключённого в фигурные скобки.
for (int n : {1, 2, 4, 8, 16}) {
std::cout << n << " ";
}Цикл for по диапазону в обратном порядке
Обычный цикл for по диапазону движется вперёд. Для обратного обхода используйте std::ranges::reverse_view (C++20) или итераторы для ручного обратного обхода.
#include <ranges>
for (auto x : v | std::views::reverse) {
std::cout << x;
}Ограничения
Цикл for по диапазону не умеет:
- Определять текущий индекс без отдельного счётчика
- Пропускать элементы или изменять контейнер во время обхода
- Параллельно обходить два контейнера (используйте обычный for или zip)
Пользовательские типы в цикле for по диапазону
Чтобы ваш класс работал с циклом for по диапазону, предоставьте методы begin() и end() или функции free_resources, возвращающие итераторы.
Быстрая проверка
Какая форма цикла for по диапазону изменяет элементы контейнера?
Итоги
Цикл for по диапазону — самый понятный способ выполнить обход. По умолчанию используйте const auto&, для изменения элементов — auto&, а для распаковки пар и кортежей — структурированные связывания.
Часто задаваемые вопросы
Урок «Цикл for на основе диапазона с контейнерами» бесплатный?
Да — полный текст урока «Цикл for на основе диапазона с контейнерами» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Цикл for на основе диапазона с контейнерами»?
Удобно перебирайте контейнеры с помощью синтаксиса цикла for на основе диапазона из C++11. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Цикл for на основе диапазона с контейнерами»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Ветвление: if-else, тернарный оператор, switch-case
- Шаблоны циклов: for, while, do-while
- Цикл for на основе диапазона с контейнерами
- Досрочный возврат, break, continue и goto