Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
39
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Глава 13. Итераторы и функциональные объекты

331

typedef Т value_type;

typedef T* pointer;

typedef T& reference;

typedef random_access_iterator_tag iterator_category; }: Разность между двумя указателями имеет стандартный тип ptrdi ff_t, определенный в <cstddef>. Аналогичная специализация шаблона введена и для типа const T*.

Поскольку только итераторы произвольного доступа поддерживают операции + и -, в библиотеке описаны функции distance и advance. Функция distance служит для определения расстояния между элементами контейнера:

distancednputlterator first. Inputlterator last);

Она возвращает значение типа di fference_type, представляющее собой разность между двумя итераторами. Эта функция для всех итераторов, кроме итераторов произвольного доступа, выполняется с использованием операции ++ за время, пропорциональное расстоянию между элементами контейнера, то есть довольно ресурсоемка. Аналогично работает и функция advance, которая применяется для реализации операции i += п:

void advance(InputIterator& i. Distance n);

Величина п может быть отрицательной только для двунаправленных итераторов и итераторов произвольного доступа.

Обратные итераторы

Для двунаправленных итераторов и итераторов произвольного доступа определены разновидности, называемые адаптерами итераторов. Адаптер, просматривающий последовательность в обратном направлении, называется reyerse_ iterator:

template <class It>

class reversejterator : public

iterator<typename iterator__traits<It>; ;iterator_category,

typename iterator__traits<It>; ;value__type,

typename iterator_traits<It>:;difference_type.

typename iterator__traits<It>; ;pointer,

typename iterator__traits<It>;; reference^

protected;

It current; public;

typedef It iterator_type;

reverse_iterator();

explicit reversejiteratordt x);

template <class U> reverse_iterator(const reverse_iterator<U>& u);

It baseO const;

reference operators) const;

pointer operator->() const;

332

Часть III. Стандартная библиотека

reverse_iterator& operator++();

reverse_iterator operator++(int);

reverse_iterator& operator--();

reversejterator operator--(i nt);

reversejterator operator* (difference_type n) const;

reverse_iterator& operator+=(difference_type n);

reverse_iterator operator- (difference_type n) const;

reverse_iterator& operator-=(difference_type n);

reference operator[](difference_type n) const; }: Обратный итератор имеет защищенное поле данных, называемое текущим итератором — current. Операция инкремента реализуется путем декремента этого итератора:

template <class It>

reverse_iterator<It>& reverse_iterator<It> operator++(){ --current; return *this; } Итератор может указывать на все элементы контейнера, включая следующий за последним, но для обратного итератора таким элементом будет элемент, стоящий перед первым, а его не существует. Поэтому current на самом деле указывает на элемент, следующий за тем, на который указывает обратный итератор. Соотношение между прямым и обратным итератором выражается следующим образом:

&*(reverse_iterator(i)) == &*(i - 1).

Для обратных итераторов поддерживаются обычные операции отношения =, !=, <, <= и >=.

Обратные итераторы описаны в контейнерных классах для просмотра их элементов в обратном порядке. Кроме того, описаны методы rbeginO и rend О, возвращающие reverse_i terator. Например, чтобы просмотреть вектор в обратном порядке, можно воспользоваться следующим циклом:

vector <int> v;

for (vector <int> reverse_iterator i = v.rbeginO; i != v.rend; ++i) cout « *i « " ":

Если контейнер объявлен как const (например, в списке передаваемых функции параметров), то требуется использовать итератор с префиксом const constreversei terator.

Итераторы вставки

Итераторы вставки так же, как и обратные, являются адаптерами итераторов. Они предназначены для добавления новых элементов в начало, конец или произвольное место контейнера. В стандартной библиотеке определено три шаблона классов итераторов вставки, построенных на основе выходных итераторов: backinserti terator, frontinsertiterator и insertiterator.