0Pricing
C++ Academy · Урок

Распространённые шаблоны итераторов: begin, end, advance

Эффективно используйте std::begin, std::end, std::advance и обратные итераторы.

«Распространённые шаблоны итераторов: begin, end, advance» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

begin() и end()

Каждый стандартный контейнер предоставляет begin() — первый элемент — и end() — позицию сразу после последнего. Полуоткрытый диапазон [begin, end) — стандартный способ перебора.

std::vector<int> v = {1, 2, 3};
for (auto it = v.begin(); it != v.end(); ++it) {
    std::cout << *it << " ";
}

std::begin и std::end

Свободные функции из <iterator>, работающие с любым контейнером, включая массивы C.

int arr[] = {1, 2, 3, 4};
for (auto it = std::begin(arr); it != std::end(arr); ++it) {
    std::cout << *it << " ";
}

cbegin и cend

Версии с c возвращают const_iterator. Используйте их, если не нужно изменять элементы и Вы хотите, чтобы компилятор это контролировал.

rbegin и rend

Обратные итераторы. rbegin() указывает на последний элемент, а rend() — на позицию перед первым.

for (auto it = v.rbegin(); it != v.rend(); ++it) {
    std::cout << *it << " ";
}

std::next и std::prev

Возвращают итератор со смещением относительно другого, не изменяя исходный.

auto it = v.begin();
auto next3 = std::next(it, 3);     // it + 3
auto prev1 = std::prev(it);         // it - 1

std::advance

Изменяет итератор на месте, перемещая его на заданное расстояние. Выбирает наилучшую реализацию на основе категории итератора.

auto it = v.begin();
std::advance(it, 5);          // moves it forward by 5

std::distance

Вычисляет количество шагов между двумя итераторами. Для произвольного доступа это O(1), в остальных случаях — O(n).

auto d = std::distance(v.begin(), it);   // index of it

Итераторы вставки

Адаптеры, превращающие присваивание во вставку:

  • std::back_inserter — push_back
  • std::front_inserter — push_front
  • std::inserter — вставка в указанную позицию
std::vector<int> dst;
std::copy(src.begin(), src.end(), std::back_inserter(dst));

Потоковые итераторы

Используйте потоки как диапазоны с помощью std::istream_iterator и std::ostream_iterator.

// Read all ints from cin, print to cout
std::copy(
    std::istream_iterator<int>(std::cin),
    std::istream_iterator<int>{},
    std::ostream_iterator<int>(std::cout, " ")
);

Удаление во время итерации

Erase возвращает следующий допустимый итератор. Сохраните его и используйте повторно.

for (auto it = v.begin(); it != v.end(); ) {
    if (*it < 0) it = v.erase(it);
    else         ++it;
}

Инвалидация итераторов

Изменение контейнера может сделать его итераторы недействительными. У vector итераторы становятся недействительными при изменении размера; list сохраняет итераторы действительными, за исключением удалённых.

Быстрая проверка

Какая функция возвращает итератор, указывающий на позицию после последнего элемента контейнера?

Итоги

Используйте begin()/end() для прямого перебора, а rbegin()/rend() — для обратного. std::next, std::prev, std::advance и std::distance работают обобщённо. Итераторы вставки адаптируют присваивание к вставке.

Часто задаваемые вопросы

Урок «Распространённые шаблоны итераторов: begin, end, advance» бесплатный?

Да — полный текст урока «Распространённые шаблоны итераторов: begin, end, advance» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Распространённые шаблоны итераторов: begin, end, advance»?

Эффективно используйте std::begin, std::end, std::advance и обратные итераторы. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Распространённые шаблоны итераторов: begin, end, advance»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Категории итераторов: input, forward, bidirectional, random
  2. Распространённые шаблоны итераторов: begin, end, advance
  3. Введение в библиотеку диапазонов C++20
  4. Адаптеры диапазонов: views::filter, transform, take
← Назад к C++ Academy