|
Программирование >> Операторы преобразования типа
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<
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |