0Pricing
C++ Academy · Урок

Категории итераторов: input, forward, bidirectional, random

Различайте категории итераторов и выбирайте совместимые с ними алгоритмы.

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

Что такое итератор

Итератор — это обобщённый указатель. Алгоритмы работают через итераторы, что отделяет их от базового контейнера.

Пять категорий итераторов

Итераторы классифицируются по своим возможностям:

  • Ввода — только чтение, один проход
  • Вывода — только запись, один проход
  • Прямого прохода — чтение и запись, несколько проходов
  • Двунаправленные — могут перемещаться вперёд и назад
  • Произвольного доступа — могут переходить на смещение, заданное целым числом

Итераторы ввода

Прочитать один раз, перейти дальше и повторить. Вернуться назад нельзя. Пример: std::istream_iterator.

std::istream_iterator<int> in(std::cin), end;
while (in != end) {
    std::cout << *in << " ";
    ++in;
}

Итераторы вывода

Только запись. Примеры: std::ostream_iterator и std::back_inserter.

std::ostream_iterator<int> out(std::cout, " ");
std::vector<int> v = {1, 2, 3};
std::copy(v.begin(), v.end(), out);

Итераторы прямого прохода

Похожи на итераторы ввода, но поддерживают несколько проходов: можно снова пройти диапазон с той же позиции. Пример: std::forward_list.

Двунаправленные итераторы

Итераторы прямого прохода с дополнительной операцией --. Примеры: std::list, std::map, std::set.

std::list<int> l = {1, 2, 3};
auto it = l.end();
--it;        // OK, points to last element

Итераторы произвольного доступа

Двунаправленные итераторы с поддержкой переходов: it + n, it - n, it[k], it1 - it2. Примеры: std::vector, std::deque, встроенные массивы.

Требования алгоритмов

Каждый алгоритм указывает минимальную необходимую категорию итераторов. std::sort требует итераторов произвольного доступа, а std::find — только итераторов ввода.

Свойства итераторов

std::iterator_traits<Iter> предоставляет тип значения итератора, его категорию и другие свойства во время компиляции.

using Category = std::iterator_traits<It>::iterator_category;
using Value = std::iterator_traits<It>::value_type;

std::advance и std::distance

Обобщённо перемещают итератор или измеряют расстояние. Они используют категорию итератора для наиболее эффективной реализации.

auto it = v.begin();
std::advance(it, 5);              // efficient on random access, O(n) otherwise
auto d = std::distance(v.begin(), it);

Пользовательские итераторы

Чтобы создать собственный итератор, определите необходимые псевдонимы типов и операции для целевой категории — operator*, operator++, operator== и другие.

Концепции итераторов C++20

В C++20 появились формальные концепции, такие как std::input_iterator, std::forward_iterator и std::random_access_iterator. Они заменяют прежнюю систему на основе тегов.

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

Какая категория итераторов поддерживает выражение it + n за константное время?

Итоги

Итераторы классифицируются по возможностям: ввода, вывода, прямого прохода, двунаправленные и произвольного доступа. Алгоритмам требуется минимальная категория. Итераторы vector поддерживают произвольный доступ, а итераторы list и map — двунаправленный доступ.

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

Урок «Категории итераторов: input, forward, bidirectional, random» бесплатный?

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

Чему я научусь в уроке «Категории итераторов: input, forward, bidirectional, random»?

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

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

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

Сколько времени занимает урок «Категории итераторов: input, forward, bidirectional, random»?

Большинство уроков 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