Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
STL5 / lab4-iterators / lab4-iterators.doc
Скачиваний:
13
Добавлен:
10.04.2015
Размер:
299.01 Кб
Скачать

Двунаправленные итераторы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);}

};

Соседние файлы в папке lab4-iterators