- •Итераторы
- •Основные понятия
- •Классификация итераторов
- •Свойства итераторов различных типов
- •Последовательные итераторы
- •Двунаправленные итераторы2
- •Итераторы произвольного доступа3
- •Итераторы ввода
- •Итераторы вывода
- •Использование итераторов
- •Вставка одного или нескольких элементов в позицию, указываемую итератором
- •Адаптеры итераторов и итераторы потоков ввода-вывода
- •Итераторы потоков ввода-вывода
- •Итераторы вставки (insert iterators).
- •Функции advance и distance
- •Теги и свойства итераторов5
- •Как написать свой итератор
Двунаправленные итераторы2
Использование (в дополнение к операциям с последовательными итераторами):
BidirectionalIterator it, it2;
it2=--it; // Продвинуть it1 назад; it2=новому значению
it2=it--;// Продвинуть it1 назад; it2=старому значению
Скелет класса (это не точное объявление класса итератора из STL, однако оно позволяет понять, какие операции входят в интерфейс итератора):
classBidirectionalIterator
{
public:
// .....
// (все операции последовательного итератора)
// Постфиксная форма
BidirectionalIterator& operator--(int);
// Префиксная форма
// До исполнения: существует итератор s: *this==++s
// После: итератор остается действительным или приобретает
// законечное значение, причем ++(--x)==x.
BidirectionalIteratoroperator--(void);
};
Итераторы произвольного доступа3
Использование (в дополнение к операциям с двунаправленным итератором):
RandomAccessIterator it1, it2;
Distance d; // Тип расстояния между итераторами: обычно
// size_t или другой целочисленный тип
it1+=d;// Продвинуть итератор вперед на d позиций
it1-=d; // Продвинуть итератор назад на d позиций
it2=it1+d;// it2=it1, продвинутый вперед на d позиций
it2=it1-d;// it2=it1, продвинутый назад на d позиций
d=it1-it2; // d=расстояние между it1 и it2
if(it1<it2) {...} // Эквивалентно if(it1-it2 < 0)
if(it1<=it2) {...} // Аналогично
if(it1>it2) {...}
if(it1>=it2) {...}
x=it1[d]; // Эквивалентно x=*(it1+d)
it1[d]=x;// Эквивалентно *(it1+d)=x
Скелет класса (это не точное объявление класса итератора из STL, однако оно позволяет понять, какие операции входят в интерфейс итератора):
classRandomAccessIterator
{
public:
// .....
// (все операции двунаправленного итератора)
// Продвижение итератора на +-n позиций.
// Знак n может быть и положительным, и отрицательным.
// Обязано быть эквивалентно по действию n операциям ++ или --.
RandomAccessIterator& operator+=(Distance n);
RandomAccessIterator& operator-=(Distance n) {return *this+=-n;}
// Создать итератор, продвинутый относительно данного на n позиций
RandomAccessIterator operator+(Distance n)
{
RandomAccessIterator tmp=*this;
return tmp+=n;
}
friend RandomAccessIterator operator+(Distance n,
const RandomAccessIterator &i)
{
return i+n;
}
// Аналогично для operator-
// Разность итераторов
Distance operator-(const RandomAccessIterator &i);
// B преобразуемо к bool или является им
// < - отношение полного упорядочения, обратное >, т.е.
// 1)либо a<b, либо b<a, либо a==b
// 2)a<b, b<c --> a<c
// 3)!(x<x)
B operator<(const RandomAccessIterator &i) {return *this-i<0;}
B operator>(const RandomAccessIterator &i) {return i<*this;}
B operator<=(const RandomAccessIterator &i) {return !(*this>i);}
B operator>=(const RandomAccessIterator &i) {return i<=*this;}
// Q должно быть преобразуемо к типу T
Q operator[](Distance n) {return *(*this+n);}
};