ПРИМЕЧАНИЕ. Тот факт, что r == s подразумевает ++r == ++s (что неверно для итераторов ввода и вывода) и что удалено ограничение на число присваиваний через итератор (которое применяется к итераторам вывода), позволяет использование многопроходных однонаправленных алгоритмов с последовательными итераторами.
Двунаправленные итераторы (Bidirectional iterators)
Класс или встроенный тип X удовлетворяет требованиям двунаправленного итератора, если к таблице, которая определяет последовательные итераторы, мы добавим следующие строки:
Таблица 5. Требования двунаправленного итератора (в дополнение к последовательному итератору)
выражение | возвращаемый тип | семантика исполнения | утверждение/примечание состояние до/после |
---|---|---|---|
--r | X& | - | до: существует s такое, что r==++s. после: s - разыменовываемое. --(++r) ==r. --r==--s подразумевает r==s.&r==&--r. |
r-- | X | {X tmp = r; - |
ПРИМЕЧАНИЕ. Двунаправленные итераторы позволяют алгоритмам перемещать итераторы назад так же, как вперёд.
Итераторы произвольного доступа (Random access iterators)
Класс или встроенный тип X удовлетворяет требованиям итераторов произвольного доступа, если к таблице, которая определяет двунаправленные итераторы, мы добавим следующие строки:
Таблица 6: Требования итератора произвольного доступа (в дополнение к двунаправленному итератору)
выражение | возвращаемый тип | семантика исполнения | утверждение/примечание состояние до/после |
---|---|---|---|
r += n | X& | {Distance m = n; if(m ›= 0) while(m--) ++r; else while(m++) --r; return r;} | - |
a + n | X | {X tmp = a; | a + n == n + a. |
r -= n | X& | return r += -n; | - |
a - n | X | {X tmp = a; | |
b - a | Distance | - | до: существует значение n типа Distance такое, что a+n=b. b==a+(b-a). |
a[n] | обратимый в T | *(a + n) | - |
a ‹ b | обратимый в bool | b - a › 0 | ‹ - это отношение полного упорядочения |