Столкнулся с книжкой Л.Аммерааль STL. В начале этой книги столкнулся с категориями итераторов и мне стало непонятно что они значат? Объясните что собой представляют категории итераторов и в чем их отличия, а то есть категорий:
входной
выходной
прямой
двунаправленный
произвольного доступа
Ответ
Категории итераторов определяют действия которые можно сделать с итератором.
Если итераторы использовали бы виртуальные функции, то категории итераторов были бы абстрактными интерфейсами, которые наследовались бы друг от друга:
интерфейс InputIterator { ... };
интерфейс OutputIterator { ... };
интерфейс ForwardIterator : InputIterator, OutputIterator { ... };
интерфейс BidirectionalIterator : ForwardIterator { ... };
интерфейс RandomAccessIterator : BidirectionalIterator { ... };
InputIterator (входной)
Копирование, присваивание.
Операции сравнения на равенство == и !=
Инкремент: ++iter и iter++
Разыменование для чтения: *iter и iter->m, при этом запрещена запись: *iter = value;
Пример входного итератора - это итератор чтения из потока: std::istream_iterator
OutputIterator (выходной)
Копирование, присваивание.
Инкремент: ++iter и iter++
Разыменование для записи: *iter = value и *iter++ = value, при этом запрещено чтение.
Пример выходного итератора - это итератор записи в поток: std::ostream_iterator
ForwardIterator (прямой)
Все операции InputIterator и OutputIterator
Требование многопроходности: если i1 == i2, то ++i1 == ++i2, т.е. итератор можно копировать, и обходить им последовательность много раз.
Прямые итераторы - это итераторы односвязных списков, например std::forward_list
BidirectionalIterator (двусторонний)
Все операции ForwardIterator
Декремент: --iter, iter--, *iter--
Пример: итераторы двусвязных списков (std::list), деревьев (std::set).
RandomAccessIterator (произвольного доступа)
Все операции BidirectionalIterator
Операции сравнения: i1 < i2, i1 > i2, i1 <= i2, i1 >= i2
Сложение/вычитание с числом: iter + n, iter += n, iter - n, iter -= n
Разность итераторов: i2 - i1
Индексирование: iter[n]
Пример: итераторы массивов (std::vector), указатели.
Комментариев нет:
Отправить комментарий