Программирование >>  Операторы преобразования типа 

1 ... 85 86 87 [ 88 ] 89 90 91 ... 239


PRINT ELEMENTS(C0ll2. 11st: );

Результат выполнения программы выглядит так:

set: 1 2 3

set: 1 2 3 44 55

set: 1 2 3

list: 1 2 3 44 55

list: 1 1 2 3 44 55 2 3 44 55

Вызовы copyO доказывают, что общий итератор вставки сохраняет порядок следования элементов. При втором вызове сору() в качестве аргумента передается позиция внутри интервала.

Пользовательские итераторы вставки для ассоциативных контейнеров

Как упоминалось выше, в ассоциативных контейнерах аргумент позиции, передаваемый общему итератору вставки, носит исключительно рекомендательный характер. Рекомендация может повысить скорость вставки, однако возможно и ее снижение. Например, если вставленные элементы хранятся в обратном порядке, то рекомендация лишь снизит эффективность программы - ведь поиск позиции вставки всегда начинается с неверной точки. Таким образом, плохая рекомендация хуже, чем отсутствие рекомендации. Это хороший пример ситуации, в которой уместно использовать расширение стандартной библиотеки С++. Пример такого расширения приведен на с. 291.

Потоковые итераторы

Потоковым итератором называется итераторный адаптер, использующий поток данных в качестве источника или приемника алгоритма. В частности, потоковый итератор ввода читает элементы из входного потока данных, а потоковый итератор вывода записывает данные в выходной поток данных.

inserterCcoll ,со11 .endO) = 55: PRINTJLEMENTSCcoll. set: );

Вставка всех элементов контейнера с использованием общего итератора вставки list<int> col 12;

copy (coll.beginO, coll.endO. Источник

inserter(coll2.coll2.beginO)): Приемник

PRINTJLEMENTS(col 12. 11 st; );

Вставка всех элементов контейнера перед вторым элементом с использованием общего итератора вставки сору (coll.beginO. coll.endO. Источник

1nserter(coll2.++coll2.beginO)): Приемник



Особую разновидность потоковых итераторов составляют итераторы пото-ковьа буферов, предназначенные для чтения или записи в потоковый буфер. Итераторы потоковых буферов рассматриваются на с. 638.

Потоковые итераторы вывода

Потоковые итераторы вывода записывают присваиваемые значения в выходной поток данных. Это позволяет напрямую выводить результаты работы алгоритмов в потоки данных через стандартный интерфейс итераторов. Реализация потоковых итераторов вывода основана на тех же принципах, что и реализация итераторов вставки (см. с. 275). Единственное различие заключается в том, что присваивание нового значения преобразуется в операцию вывода оператором . В табл. 7.9 перечислены операции потоковых итераторов вывода.

Таблица 7.9. Операции потоковых итераторов вывода Выражение Описание

ostreamjterator<T>(ostream) Создание потокового итератора вывода для потока

данных ostream

ostream iterator<T>(ostream,delim) Создание потокового итератора вывода для потока

данных ostream с разделением выводимых значений строкой delim (параметр dellm относится к типу const char*)

*iter Фиюивная операция (возвращает iter)

iterl ~ value Записывает value в поток данных ostream: ostream<<value

(после чего выводится разделитель delim, если он задан)

++iter Фиктивная операция (возвращает iter)

iter++ Фиктивная операция (возвращает iter)

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

Потоковые итераторы вывода определяются для типа элемента Т:

namespace std {

teniplate <с1а55 Т.

class charT = cliar.

class traits = char traits<char T> > class ostream 1terator:

Необязательные второй и третий аргументы шаблона определяют тип используемого потока данных (их смысл разъясняется на с, 562),

В устареаитих системах необязательные параметры шаблона отсутствуют.



Следующий пример демонстрирует использование потоковых итераторов вывода.

iter/ostriter.cpp #include <iostreani> #1nclude <vector> #1nclude <algorithiTi> #1nclude <iterator> using namespace std:

int mainO

Создание потокового итератора вывода для потока cout - выводимые значения разделяются символом новой строки ostream iterator<int> intWriterCcout. \п );

Запись элементов через обычный интерфейс итераторов

*lntWr1ter = 42:

intWriter++:

*intWriter = 77:

1ntWriter++;

*intWriter = -5:

Создание коллекции с элементами от 1 до 9 vector<int> coll: for Cint i=l: i<=9: { coll.push back(l):

Запись всех элементов без разделителей сору (coll.beginO. coll.endO,

ostream iterator<1nt>Ccout)); cout endl:

Запись всех элементов с разделителем < сору Ccoll .beginC). coll.endO.

ostream iterator<int>(cout. < )); cout endl:

Результат выполнения программы выглядит так:

42 77

123456789

1<2<3<4<5<6<7<8<9<



1 ... 85 86 87 [ 88 ] 89 90 91 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика