Перебор векторов: индекс, range-for, итераторы
Перебирайте вектор с помощью доступа по индексу, range-for и явных итераторов.
«Перебор векторов: индекс, range-for, итераторы» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Три способа перебора
Перебирать вектор можно с помощью:
- цикла по индексу
for (size_t i = 0; i < v.size(); ++i) - цикла по диапазону
for (auto& x : v) - итераторов
for (auto it = v.begin(); it != v.end(); ++it)
Цикл по индексу
Знакомый по языку C способ. Полезен, когда вместе со значением нужен индекс.
for (size_t i = 0; i < v.size(); ++i) {
std::cout << i << ": " << v[i] << "\n";
}size_t и int
size() возвращает size_t — беззнаковый тип. Смешивание его со знаковым счётчиком int приводит к предупреждениям компилятора и трудно обнаруживаемым ошибкам. Используйте size_t или std::ssize из C++20.
Цикл по диапазону
Это самый ясный вариант, если индексы Вам не нужны. Выбирайте подходящий квалификатор ссылки.
for (const auto& x : v) std::cout << x << " "; // read only
for (auto& x : v) x *= 2; // modify in placeИтераторы
Итератор — это обобщённый указатель. v.begin() указывает на первый элемент, а v.end() — на позицию сразу после последнего.
for (auto it = v.begin(); it != v.end(); ++it) {
std::cout << *it << " ";
}const_iterator
Используйте cbegin() и cend(), если изменять элементы не нужно: тип итератора будет const_iterator.
Обратные итераторы
rbegin() и rend() перебирают элементы от последнего к первому. Разыменование даёт те же элементы, но в обратном порядке.
for (auto it = v.rbegin(); it != v.rend(); ++it) {
std::cout << *it << " ";
}Арифметика итераторов
Итераторы вектора поддерживают произвольный доступ: к ним можно прибавлять и из них вычитать целые числа, а также сравнивать их с помощью <.
auto it = v.begin();
it += 3; // skip 3 elements
std::cout << *it;Алгоритмы используют итераторы
Алгоритмы STL принимают пары итераторов. Передавайте v.begin(), v.end() в такие алгоритмы, как std::sort или std::find.
#include <algorithm>
std::sort(v.begin(), v.end());
auto it = std::find(v.begin(), v.end(), 42);Когда итераторы становятся недействительными
Добавление элементов в вектор может привести к перераспределению памяти. Все итераторы, указатели и ссылки на элементы вектора становятся недействительными после любой операции, изменяющей capacity.
Подводный камень: изменение во время перебора
Никогда не вызывайте push_back или erase во время перебора того же вектора циклом по диапазону. Создайте новый вектор или соберите индексы, а затем обработайте их.
Быстрая проверка
В каком варианте перебора итератор становится недействительным, если push_back вызывает перераспределение памяти?
Итоги
Выбирайте цикл по диапазону, если индексы не нужны, цикл по индексу — если нужны, а перебор с итераторами — при работе с алгоритмами. Перераспределение памяти делает итераторы недействительными — никогда не вызывайте push_back во время перебора.
Часто задаваемые вопросы
Урок «Перебор векторов: индекс, range-for, итераторы» бесплатный?
Да — полный текст урока «Перебор векторов: индекс, range-for, итераторы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Перебор векторов: индекс, range-for, итераторы»?
Перебирайте вектор с помощью доступа по индексу, range-for и явных итераторов. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Перебор векторов: индекс, range-for, итераторы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы std::vector: push_back, size, capacity
- Перебор векторов: индекс, range-for, итераторы
- Изменение векторов: insert, erase, clear
- Вектор, std::array и массив C