На этом шаге мы рассмотрим прямые итераторы.
Прямые итераторы представляют собой комбинацию итераторов ввода и вывода. Они обладают всеми свойствами итераторов ввода и большинством свойств итераторов вывода. Операции прямых итераторов перечислены в таблице 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: }
На следующем шаге мы рассмотрим двунаправленные итераторы.