0Pricing
C++ Academy · Урок

Перебор векторов: индекс, 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 — локальная установка не требуется.

Все уроки этого курса

  1. Основы std::vector: push_back, size, capacity
  2. Перебор векторов: индекс, range-for, итераторы
  3. Изменение векторов: insert, erase, clear
  4. Вектор, std::array и массив C
← Назад к C++ Academy