Распространённые шаблоны итераторов: 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 - 1std::advance
Изменяет итератор на месте, перемещая его на заданное расстояние. Выбирает наилучшую реализацию на основе категории итератора.
auto it = v.begin();
std::advance(it, 5); // moves it forward by 5std::distance
Вычисляет количество шагов между двумя итераторами. Для произвольного доступа это O(1), в остальных случаях — O(n).
auto d = std::distance(v.begin(), it); // index of itИтераторы вставки
Адаптеры, превращающие присваивание во вставку:
std::back_inserter— push_backstd::front_inserter— push_frontstd::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 — локальная установка не требуется.
Все уроки этого курса
- Категории итераторов: input, forward, bidirectional, random
- Распространённые шаблоны итераторов: begin, end, advance
- Введение в библиотеку диапазонов C++20
- Адаптеры диапазонов: views::filter, transform, take