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

Итераторы ввода

Использование:

InputIterator it1; // Конструктор без аргументов

InputIterator it2(it1); // Конструктор копий

it1=it2; // Оператор присваивания

if(it1==it2) {...} // Проверка на равенство. Равенство – лишь в том случае, когда it1 – копия it2 (полученная с помощью присваивания или конструктора копий), или наоборот.

if(it1!=it2) {...} // Неравенство – отрицание равенства

++it1; // Аналогично таким же операциям для последовательного итератора

it1++;

x=*it1; // Итератор ввода допускает чтение

// *it1=x – некорректно, т.к. итератор ввода не допускает записи

Скелет класса (это не точное объявление класса итератора из STL, однако оно позволяет понять, какие операции входят в интерфейс итератора):

class InputIterator

{

public:

// Конструктор копий

InputIterator(const InputIterator &i);

// Оператор присваивания

InputIterator& operator=(const InputIterator &i);

// B должен быть преобразуем к типу bool или просто является им

// Возвращает true тогда и только тогда, когда i - копия *this.

B operator==(const InputIterator &i);

B operator!=(const InputIterator &i) {return !(i==*this);}

// Операторы инкремента (продвижения, увеличения на единицу).

// Увеличиваемый итератор должен быть действительным (разыменовываемым).

// После увеличения он может быть либо остаться действительным,

// либо приобрести законечное значение.

// Префиксная форма оператора: ++x

// Напомним, что для итераторов ввода a==b не означает ++a==++b.

InputIterator& operator++(void);

// Постфиксная форма: x++

// Обычно после a=x++ a=старому значению х.

// Но поскольку после увеличения итератора старое значение

// недействительно, здесь возвращаемое значение запрещено

// использовать; его тип - void

void operator++(int);

// Итератор должен быть действительным.

// Если a - копия b, то *а эквивалентно *b.

const T& operator*();

};

Итераторы вывода

Использование:

OutputIterator it1;

OutputIterator it2(it1);

++it1;

it1++; // После предыдущей строчки эта операция некорректна; отдельно - допустима

*it1=x; // Итератор вывода допускает только запись

// x=*it1; - некорректно, итератор вывода не допускает чтения

Скелет класса (это не точное объявление класса итератора из STL, однако оно позволяет понять, какие операции входят в интерфейс итератора):

class OutputIterator

{

public:

// Конструктор копий.

// *a=t эквивалентно *OutputIterator(a)=t.

OutputIterator(const OutputIterator &i);

// Единственное законное использование итератора вывода -

// запись в указуемый элемент, т.е. вообще говоря класс Q

// должен быть объектом-курсором, допускающим запись (ровно

// однократную), но не допускающим чтение.

Q operator*();

// Префиксная форма

OutputIterator operator++(void);

// Постфиксная форма

OutputIterator operator++(int);

};

Нетрудно заметить, что указатели языка С++ обладают всеми свойствами итераторов произвольного доступа, для них имеют смысл все операции, которые имеют смысл для итераторов произвольного доступа. Учитывая, что STL является шаблонной библиотекой, T* может быть использован в качестве итератора произвольного доступа, а const T* в качестве константного итератора произвольного доступа.

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