Категории итераторов: 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 — локальная установка не требуется.
Все уроки этого курса
- Категории итераторов: input, forward, bidirectional, random
- Распространённые шаблоны итераторов: begin, end, advance
- Введение в библиотеку диапазонов C++20
- Адаптеры диапазонов: views::filter, transform, take