#cpp #stl
Столкнулся с книжкой Л.Аммерааль STL. В начале этой книги столкнулся с категориями итераторов и мне стало непонятно что они значат? Объясните что собой представляют категории итераторов и в чем их отличия, а то есть категорий: входной выходной прямой двунаправленный произвольного доступа
Ответы
Ответ 1
Категории итераторов определяют действия которые можно сделать с итератором. Если итераторы использовали бы виртуальные функции, то категории итераторов были бы абстрактными интерфейсами, которые наследовались бы друг от друга: интерфейс 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), указатели.
Комментариев нет:
Отправить комментарий