На этом шаге мы рассмотрим итераторы ввода.
Итератор ввода перемещается только вперед и поддерживает только чтение (то есть возвращает значения элементов в порядке их перебора). В таблице 1 перечислены операции итераторов ввода.
Описание | Выражение |
---|---|
*iter | Обращение к элементу |
iter->member | Обращение к переменной или функции элемента |
++iter | Смещение вперед (возвращает новую позицию) |
iter++ | Смещение вперед (возвращает старую позицию) |
iter1 == iter2 | Проверка двух итераторов на равенство |
iter1 != iter2 | Проверка двух итераторов на неравенство |
TYPE(iter) | Копирование итератора (копирующий конструктор) |
Итератор ввода читает элементы только один раз. Если скопировать итератор ввода и выполнить чтение через оригинал и копию, вы можете получить разные значения.
Практически любой итератор обладает базовыми возможностями итераторов ввода, но большинство итераторов способно на большее. Типичным примером "чистого" итератора ввода является итератор, читающий данные из стандартного входного потока данных (обычно с клавиатуры). Одно значение не может быть прочитано дважды. После чтения слова из входного потока данных при следующем обращении будет получено другое слово.
Два итератора ввода считаются равными, если они находятся в одной позиции. Однако, как упоминалось выше, это не означает, что при следующем чтении они вернут одно и то же значение.
По возможности используйте префиксный оператор перемещения итератора вместо постфиксного, потому что он может работать более эффективно. Дело в том, что префиксной форме не нужно возвращать старое значение, которое должно храниться во временном объекте. Следовательно, для итератора pos (и любого абстрактного типа данных) рекомендуется использовать префиксный оператор:
++pos // Правильно и быстро
Префиксный оператор работает быстрее постфиксного:
pos++ // Правильно, но не быстро
Это утверждение относится и к оператору -- (для тех итераторов, для которых он определен, - итераторы ввода его не поддерживают).
На следующем шаге мы рассмотрим итераторы вывода.