На этом шаге мы рассмотрим прямые итераторы.
Прямые итераторы представляют собой комбинацию итераторов ввода и вывода. Они обладают всеми свойствами итераторов ввода и большинством свойств итераторов вывода. Операции прямых итераторов перечислены в таблице 1.
| Выражение | Описание |
|---|---|
| *iter | Обращение к элементу |
| iter->member | Обращение к переменной или функции элемента |
| ++iter | Смещение вперед (возвращает новую позицию) |
| iter++ | Смещение вперед (возвращает старую позицию) |
| iter1 == iter2 | Проверка двух итераторов на равенство |
| iter1 != iter2 | Проверка двух итераторов на неравенство |
| TYPE() | Копирование итератора (конструктор по умолчанию) |
| TYPE(iter) | Копирование итератора (копирующий конструктор) |
| iter1 = iter2 | Присваивание итератора |
В отличие от итераторов ввода и вывода прямые итераторы могут ссылаться на один и тот же элемент коллекции и обрабатывать его по несколько раз.
Возможна, вас интересует, почему прямой итератор не обладает всеми свойствами итератора вывода. Существует одно важное ограничение, из-за которого код, действительный для итераторов вывода, оказывается недействительным для прямых итераторов.
// ОК для итераторов вывода // ОШИБКА для прямых итераторов while (true) { *pos = foo(); ++pos; }
// ОК для прямых итераторов // ОШИБКА для итераторов вывода while (pos != coll.end()) { *pos = foo(); ++pos: }
На следующем шаге мы рассмотрим двунаправленные итераторы.