Когда происходит вызов front_inserter(c), возвращается итератор вставки, который последовательно вызывает функцию push_front(). По мере вставки каждого элемента он становится новым первым элементом контейнера с. Следовательно, адаптер front_inserter возвращает итератор, который полностью изменяет порядок последовательности, в которую осуществляется вставка; адаптеры inserter и back_inserter так не поступают.

Упражнения раздела 10.4.1

Упражнение 10.26. Объясните различия между тремя итераторами вставки.

Упражнение 10.27. В дополнение к функции unique() (см. раздел 10.2.3) библиотека определяет функцию unique_copy(), получающую третий итератор, обозначающий назначение копирования уникальных элементов. Напишите программу, которая использует функцию unique_copy() для копирования уникальных элементов вектора в первоначально пустой список.

Упражнение 10.28. Скопируйте вектор, содержащий значения от 1 до 9, в три других контейнера. Используйте адаптеры inserter, back_inserter и front_inserter соответственно для добавления элементов в эти контейнеры. Предскажите вид результирующей последовательности в зависимости от вида адаптера вставки и проверьте свои предсказания на написанной программе.

<p><image l:href="#books.png"/>10.4.2. Потоковые итераторы</p>

Хотя типы iostream не относятся к контейнерам, есть итераторы, применимые к объектам типов ввода-вывода (см. раздел 8.1). Итератор istream_iterator (табл. 10.3) читает входной поток, а итератор ostream_iterator (табл. 10.4) пишет в поток вывода. Эти итераторы рассматривают свой поток как последовательность элементов определенного типа. Используя потоковый итератор, можно применять обобщенные алгоритмы для чтения или записи данных в объекты потоков.

Таблица 10.3. Операторы итератора istream_iterator

istream_iterator in(is);in читает значения типа T из входного потока is
istream_iterator end;Итератор после конца для итератора istream_iterator, читающего значения типа Т
in1 == in2 in1 != in2in1 и in2 должны читать одинаковый тип. Они равны, если оба они конечные или оба связаны с тем же входным потоком
*inВозвращает значение, прочитанное из потока
in->memСиноним для (*in).mem
++in, in++Читает следующее значение из входного потока, используя оператор >> для типа элемента. Как обычно, префиксная версия возвращает ссылку на итератор после инкремента. Постфиксная версия возвращает прежнее значение
Использование итератора istream_iterator

Когда создается потоковый итератор, необходимо определить тип объектов, которые итератор будет читать или записывать. Итератор istream_iterator использует оператор >> для чтения из потока. Поэтому тип, читаемый итератором istream_iterator, должен определять оператор ввода. При создании итератор istream_iterator следует связать с потоком. В качестве альтернативы итератор можно инициализировать значением по умолчанию. В результате будет создан итератор, который можно использовать как значение после конца.

istream_iterator int_it(cin); // читает целые числа из cin

istream_iterator int_eof; // конечное значение итератора

ifstream in("afile");

istream_iterator str_it(in); // читает строки из "afile"

Для примера используем итератор istream_iterator для чтения со стандартного устройства ввода в вектор:

istream_iterator in_iter(cin); // читает целые числа из cin

istream_iterator eof;          // "конечный" итератор istream

while (in_iter != eof)              // пока есть что читать

 // постфиксный инкремент читает поток и возвращает прежнее значение

 // итератора. Обращение к значению этого итератора предоставляет

 // предыдущее значение, прочитанное из потока

Перейти на страницу:

Похожие книги