Итераторы
Понятие итераторов неразрывно связано с понятием контейнеров. Под контейнером понимают некоторый объект, который содержит в себе группу других (обычно однотипных) объектов. Таким образом, хорошо известные структуры данных, такие как вектор, список, стек, карта, - являются контейнерами. Для получения доступа к элементам контейнеров используются итераторы. Итератор - объект, предоставляющий доступ к элементам контейнера и позволяющий их перебирать. В первых реализациях стандартной библиотеки С++ итератор реализовывался как указатель на элемент контейнера.
Существуют несколько видов итераторов. Они образуют иерархию, отличаются друг от друга наличием (отсутствием) некоторых свойств:
Итератор ввода ← Последовательный итератор ← Двунаправленный итератор ← Итератор произвольного доступа Итератор вывода ←
На схеме сверху показаны связи между итераторами. Эти связи означают, например, что последовательный итератор обладает всеми свойствами итераторов ввода и вывода, поэтому он может их заменять.
Итераторы ввода
Итераторы ввода (Input iterators) позволяют изменять значения объектов контейнера. Требования к итераторам ввода представлены в листинге input_iterator.h.
Учитывая, что итераторы ввода изменяют контейнер, не имеет смысла пользоваться одним и тем же итератором ввода дважды, потому что второй раз он может ссылаться на другой элемент контейнера.
Итераторы вывода
Итераторы вывода (output iterators) позволяют получать значения элементов контейнера. Требования к итераторам вывода представлены в листинге output_iterator.h.
Последовательные итераторы
Consecutive iterators
Таблица 3 Требования последовательного итератора
IT u;
примечание: u может иметь исключительное значение. примечание: предполагается деструктор.
IT()
примечание: IT() может быть исключительным.
IT(a);
a == IT(a)
IT u(a); IT u = a;
после: u == a.
a == b
обратимый в bool
== - это отношение эквивалентности.
a != b
обратимый в bool
r = a
IT&
после: r == a.
*a
обратимый в T
до: a - разыменовываемое. a == b подразумевает *a == *b. Если IT - модифицируемый, то *a = t - допустимо.
++r
IT&
до: r - разыменовываемое. после: r - разыменовываемое или r - законечное. r == s и r - разыменовываемое подразумевает ++r == ++s. &r == &++r.
r++
IT
Двунаправленные итераторы
bidirectional iterators
Таблица 4 Требования двунаправленного итератора (в дополнение к последовательному итератору)
--r
IT&
до: существует s такое, что r == ++s. после: s - разыменовываемое. --(++r) == r. --r == --s подразумевает r == s. &r == &--r.
r--
IT
Итераторы произвольного доступа
Random access iterators
Таблица 5 Требования итератора произвольного доступа (в дополнение к двунаправленному итератору)
r += n
IT&
a + n n + a
IT
a + n == n + a.
r -= n
IT&
a - n
IT
b - a
Distance
до: существует значение n типа Distance такое, что a + n = b. b == a + (b - a).
a[n]
обратимый в T
a < b
обратимый в bool
< - это отношение полного упорядочения
a > b
обратимый в bool
> - это отношение полного упорядочения, противоположное <.
a >= b
обратимый в bool
a <= b
обратимый в bool
Last updated