The Wayback Machine - https://web.archive.org/web/20220705063343/https://ru.cppreference.com/w/cpp/iterator
Пространства имён
Варианты
Действия

Библиотека итераторов

Материал из cppreference.com
< cpp
 
C++
Поддержка компилятором
Автономные и размещённые реализации
Язык
Заголовки стандартной библиотеки
Требования к именованию
Макросы тестирования функциональности (C++20)
Поддержка языка
Библиотека концептов (C++20)
Библиотека метапрограммирования (C++11)
Библиотека диагностики
Библиотека общих утилит
Библиотека строк
Библиотека контейнеров
Библиотека итераторов
Библиотека диапазонов (C++20)
Библиотека алгоритмов
Библиотека численных данных
Библиотека ввода/вывода
Библиотека локализаций
Регулярные выражения (C++11)
Атомарные операции (C++11)
Библиотека поддержки конкуренции (C++11)
Библиотека файловой системы (C++17)
Технические спецификации
Указатель символов
Внешние библиотеки
 
Библиотека итераторов
Концепты итераторов
Примитивы итераторов
Концепты алгоритмов и утилиты
Косвенно вызываемые концепты
Общие требования к алгоритмам
Утилиты
(C++20)
Адаптеры итераторов
Потоковые итераторы
Точки настройки итераторов
Операции итераторов
(C++11)
(C++11)
Доступ к диапазону
(C++11)(C++14)
(C++11)(C++14)
(C++17)(C++20)
(C++14)(C++14)
(C++14)(C++14)
(C++17)
(C++17)
 

Библиотека итераторов предоставляет определения итераторов для пяти (до C++17)шести (начиная с C++17) видов, а также свойств итераторов, адаптеров и служебных функций.

Содержание

[править] Категории итераторов

Существует пять (до C++17)шесть (начиная с C++17) видов итераторов: LegacyInputIterator, LegacyOutputIterator, LegacyForwardIterator, LegacyBidirectionalIterator, LegacyRandomAccessIterator и LegacyContiguousIterator (начиная с C++17).

Вместо того, чтобы определяться конкретными типами, каждая категория итераторов определяется операциями, которые могут быть выполнены с нею. Это определение означает, что любой тип, поддерживающий необходимые операции, может использоваться в качестве итератора – например, указатель поддерживает все операции, требуемые для LegacyRandomAccessIterator, поэтому указатель можно использовать где угодно, где ожидается LegacyRandomAccessIterator.

Все категории итераторов (кроме LegacyOutputIterator) могут быть организованы в иерархию, где более мощные категории итераторов (например, LegacyRandomAccessIterator) поддерживают операции менее мощных категорий (например, LegacyInputIterator). Если итератор попадает в одну из этих категорий и также соответствует требованиям LegacyOutputIterator, то он называется изменяемым итератором и поддерживает ввод и вывод. Неизменяемые итераторы называются константными итераторами.

Категория итератора Определённые операции
LegacyContiguousIterator LegacyRandomAccessIterator LegacyBidirectionalIterator LegacyForwardIterator LegacyInputIterator
  • чтение
  • инкремент (без нескольких проходов)
  • инкремент (с несколькими проходами)
  • декремент
  • случайный доступ
  • непрерывное хранилище

Итераторы, которые попадают в одну из вышеперечисленных категорий и также соответствуют требованиям LegacyOutputIterator, называются изменяемыми итераторами.

LegacyOutputIterator
  • запись
  • инкремент (без нескольких проходов)

Примечание: категория LegacyContiguousIterator была указана в C++17 только формально, но итераторы std::vector, std::basic_string, std::array и std::valarray, а также указатели на массивы C часто рассматриваются как отдельная категория в коде до C++17.

[править] Концепты итераторов C++20

В C++20 представлена новая система итераторов, основанная на концептах, которая отличается от итераторов C++17. Хотя основная схема остаётся схожей, требования к отдельным категориям итераторов несколько отличаются.

Определены в пространстве имён std
указывает, что тип доступен для чтения косвенно с помощью оператора *
(концепт) [править]
указывает, что значение может быть записано в объект, на который указывает ссылка итератора
(концепт) [править]
указывает, что тип semiregular может увеличиваться с помощью операторов до и после инкремента
(концепт) [править]
указывает, что операция инкремента для типа weakly_incrementable сохраняет равенство и что этот тип является equality_comparable
(концепт) [править]
указывает, что объекты типа могут быть инкрементированы и разыменованы
(концепт) [править]
указывает, что тип является ограничителем для типа input_or_output_iterator
(концепт) [править]
указывает, что оператор - может быть применён к итератору и ограничителю, чтобы вычислить их разницу за постоянное время
(концепт) [править]
указывает, что тип является итератором ввода, то есть значения, на которые он ссылается, могут быть прочитаны, и он может быть как пре-инкрементирован, так и пост-инкрементирован
(концепт) [править]
указывает, что тип является итератором вывода для данного типа значения, то есть в него могут быть записаны значения этого типа, и он может быть как пре-, так и пост-инкрементирован
(концепт) [править]
указывает, что input_iterator является прямым итератором, поддерживающим сравнение на равенство и многопроходность
(концепт) [править]
указывает, что forward_iterator является двунаправленным итератором, поддерживающим движение назад
(концепт) [править]
указывает, что bidirectional_iterator это итератор с произвольным доступом, поддерживающий продвижение за постоянное время и индексирование
(концепт) [править]
указывает, что random_access_iterator является непрерывным итератором, ссылающимся на смежные элементы памяти
(концепт) [править]

[править] Типы, связанные с итераторами

Определены в пространстве имён std
вычисляет разностный тип типа weakly_incrementable
(шаблон класса) [править]
вычисляет тип значения типа indirectly_readable
(шаблон класса) [править]
вычисляет связанные типы итератора
(псевдоним шаблона) [править]

[править] Примитивы итераторов

предоставляет единый интерфейс к свойствам итератора
(шаблон класса) [править]
пустые типы классов, используемые для обозначения категорий итераторов
(класс) [править]
(устарело в C++17)
базовый класс для упрощения определения требуемых типов для простых итераторов
(шаблон класса) [править]

[править] Точки настройки итераторов

Определены в пространстве имён std::ranges
(C++20)
приводит результат разыменования объекта к связанному с ним типу правосторонней ссылки
(объект точки настройки) [править]
(C++20)
меняет местами значения, на которые ссылаются два разыменовываемых объекта
(объект точки настройки) [править]

[править] Концепты алгоритмов и утилиты

C++20 также предоставляет набор концептов и связанных шаблонов служебных утилит, предназначенных для упрощения ограничения операций общих алгоритмов.

Определены в заголовочном файле <iterator>
Определены в пространстве имён std
Косвенно вызываемые концепты
указывает, что вызываемый тип может быть вызван в результате разыменования типа indirectly_readable
(концепт) [править]
указывает, что вызываемый тип, когда он вызывается с результатом разыменования типа indirectly_readable, соответствует predicate
(концепт) [править]
указывает, что вызываемый тип, когда он вызывается с результатом разыменования двух типов indirectly_readable, соответствует predicate
(концепт) [править]
указывает, что вызываемый тип при вызове в результате разыменования двух типов indirectly_readable, соответствует equivalence_relation
(концепт) [править]
указывает, что вызываемый тип, когда он вызывается с результатом разыменования двух типов indirectly_readable, соответствует strict_weak_order
(концепт) [править]
Общие требования к алгоритмам
указывает, что значения могут быть перемещены из типа indirectly_readable в тип indirectly_writable
(концепт) [править]
указывает, что значения могут быть перемещены из типа indirectly_readable в тип indirectly_writable и что перемещение может быть выполнено через промежуточный объект
(концепт) [править]
указывает, что значения могут быть скопированы из типа indirectly_readable в тип indirectly_writable
(концепт) [править]
указывает, что значения могут быть скопированы из типа indirectly_readable в тип indirectly_writable что копирование может быть выполнено через промежуточный объект
(концепт) [править]
указывает, что значения, на которые ссылаются два типа indirectly_readable, можно поменять местами
(концепт) [править]
указывает, что значения, на которые ссылаются два типа indirectly_readable, могут сравниваться
(концепт) [править]
определяет общие требования к алгоритмам, которые меняют порядок элементов на месте
(концепт) [править]
(C++20)
определяет требования к алгоритмам, которые объединяют отсортированные последовательности в выходную последовательность путём копирования элементов
(концепт) [править]
(C++20)
определяет общие требования алгоритмов, которые переставляют последовательности в упорядоченные последовательности
(концепт) [править]
Утилиты
вычисляет результат вызова вызываемого объекта на результате разыменования некоторого набора типов indirectly_readable
(псевдоним шаблона) [править]
(C++20)
вспомогательный шаблон для определения ограничений для алгоритмов, принимающих прогнозы
(шаблон класса) [править]

[править] Адаптеры итераторов

адаптер итератора для обхода в обратном порядке
(шаблон класса) [править]
создаёт std::reverse_iterator типа, выведенного из аргумента
(шаблон функции) [править]
адаптер итератора, который разыменовывается в правостороннюю ссылку
(шаблон класса) [править]
адаптер ограничитель для использования с std::move_iterator
(шаблон класса) [править]
создаёт std::move_iterator типа, выведенного из аргумента
(шаблон функции) [править]
адаптирует тип итератора и его ограничителя к общему типу итератора
(шаблон класса) [править]
ограничитель по умолчанию для использования с итераторами, которые знают границу своего диапазона
(класс) [править]
адаптер итератора, отслеживающий расстояние до конца диапазона
(шаблон класса) [править]
ограничитель, который всегда сравнивает на неравенство с любым типом weakly_incrementable
(класс) [править]
адаптер итератора для вставки в конец контейнера
(шаблон класса) [править]
создаёт std::back_insert_iterator типа, выведенного из аргумента
(шаблон функции) [править]
адаптер итератора для вставки в начало контейнера
(шаблон класса) [править]
создаёт std::front_insert_iterator типа, выведенного из аргумента
(шаблон функции) [править]
адаптер итератора для вставки в контейнер
(шаблон класса) [править]
создаёт std::insert_iterator типа, выведенного из аргумента
(шаблон функции) [править]

[править] Потоковые итераторы

итератор ввода, читающий из std::basic_istream
(шаблон класса) [править]
итератор вывода, записывающий в std::basic_ostream
(шаблон класса) [править]
итератор ввода, читающий из std::basic_streambuf
(шаблон класса) [править]
итератор вывода, записывающий в std::basic_streambuf
(шаблон класса) [править]

[править] Операции над итераторами

Определены в заголовочном файле <iterator>
продвигает итератор на заданное расстояние
(функция) [править]
возвращает расстояние между двумя итераторами
(функция) [править]
(C++11)
инкрементирует итератор
(функция) [править]
(C++11)
декрементирует итератор
(функция) [править]
продвигает итератор на заданное расстояние или до заданной границы
(ниблоид) [править]
возвращает расстояние между итератором и ограничителем или между началом и концом диапазона
(ниблоид) [править]
инкрементирует итератор на заданное расстояние или до границы
(ниблоид) [править]
декрементирует итератор на заданное расстояние или до границы
(ниблоид) [править]

[править] Доступ к диапазону

Эти функции, не являющиеся элементами, предоставляют общий интерфейс для контейнеров, простых массивов и std::initializer_list.

Определены в заголовочном файле <array>
Определены в заголовочном файле <deque>
Определены в заголовочном файле <forward_list>
Определены в заголовочном файле <iterator>
Определены в заголовочном файле <list>
Определены в заголовочном файле <map>
Определены в заголовочном файле <regex>
Определены в заголовочном файле <set>
Определены в заголовочном файле <span>
Определены в заголовочном файле <string>
Определены в заголовочном файле <string_view>
Определены в заголовочном файле <unordered_map>
Определены в заголовочном файле <unordered_set>
Определены в заголовочном файле <vector>
Определены в пространстве имён std
(C++11)
(C++14)
возвращает итератор на начало контейнера или массива
(шаблон функции) [править]
(C++11)
(C++14)
возвращает итератор на конец контейнера или массива
(шаблон функции) [править]
возвращает обратный итератор на начало контейнера или массива
(шаблон функции) [править]
(C++14)
возвращает обратный конечный итератор для контейнера или массива
(шаблон функции) [править]
(C++17)
(C++20)
возвращает размер контейнера или массива
(шаблон функции) [править]
(C++17)
проверяет, пустой ли контейнер
(шаблон функции) [править]
(C++17)
получает указатель на базовый массив
(шаблон функции) [править]
Источник — «https://ru.cppreference.com/mwiki/index.php?title=cpp/iterator&oldid=52319»