Страницы

Поиск по вопросам

среда, 31 октября 2018 г.

Категории итераторов

Столкнулся с книжкой Л.Аммерааль 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), указатели.

Комментариев нет:

Отправить комментарий