Анимация
JavaScript
|
Главная Библионтека Особую разновидность потоковых итераторов составляют итераторы пото-ковьа буферов, предназначенные для чтения или записи в потоковый буфер. Итераторы потоковых буферов рассматриваются на с. 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, если он задан) -b+iter Фиктивная операция (возвращает iter) iter++ Фиктивная операция (возвращает iter) При создании потокового итератора вывода необходимо указать выходной ноток данных, в который должны записываться данные. В необязательном аргументе можно передать строку, которая должна выводиться между отдельными значениями. Без разделителя элементы будут выводиться непосредственно друг за другом. Потоковые итераторы вывода определяются для типа элемента Т: namespace std { teniplate <с1а55 Т. class charT = ctiar. class traits = char traits<ctiar T> > class ostream 1terator: Необязательные второй и третий аргументы шаблона определяют тип используемого потока данных (их смысл разъясняется на с, 562), В устареаитих системах необязательные параметры шаблона отсутствуют. Следующий пример демонстрирует использование потоковых итераторов вывода. iter/ostriter.cpp #include <iostreani> #1nclude <vector> #1nclude <algorithiTi> #1nclude <iterator> using namespace std: int mainO Создание потокового итератора вывода для потока cout - выводимые значения разделяются символом новой строки ostream 1terator<1nt> intWriterCcout."\п"): Запись элементов через обычный интерфейс итераторов *intWriter = 42: intWr1ter++: *intWriter = 77: intWriter++; *intWr1ter = -5: Создание коллекции с элементами от 1 до 9 vector<int> coll: for (int i=l: i<=9: ++i) { coll.push back(i): Запись всех элементов без разделителей сору (coll.beginO. coll.endO, ostream 1terator<int>(cout)); cout « endl: Запись всех элементов с разделителем " < " сору (coll.beginO. coll.endO, ostream 1terator<1nt>(cout." < ")); cout « endl: Результат выполнения программы выглядит так: 42 77 123456789 1<2<3<4<5<6<7<8<9<
Конструктор потокового итератора ввода открывает поток данных н обычно читает первый элемент, поскольку в противном случае он не смог бы вернуть Разделитель относится к типу const char*, поэтому при передаче объекта типа string необходимо преобразовать его к правильному типу вызовом функции c str() (см. с. 495). Пример: string delim; ostrea[n iterator<int>Ccout.delini.c str()); Потоковые итераторы ввода Потоковые итераторы ввода являются противоположностью потоковых итераторов вывода. Потоковый итератор ввода читает элементы из входного потока данных. Это позволяет алгоритмам читать свои исходные данные прямо из потока. Тем пе менее потоковые итераторы ввода устроены несколько сложнее потоковых итераторов вывода (как обычно, чтение является более сложной операцией, чем запись). В момент создания потоковый итератор ввода инициализируется входным потоком данных, из которого будут читаться данные. Далее стандартный интерфейс итераторов ввода (см. с. 258) используется для чтения элементов оператором >>. Тем не менее чтение может завершиться неудачей (при достижении конпд файла или возникновении ошибки), а интервальному источнику алгоритма необходима «конечная позиция». Обе проблемы решаются при помощи итератора коица потока данных., создаваемого консфуктором но умолчанию 1ютоковых итераторов ввода. Если попытка чтения завершается неудачей, все потоковые итераторы ввода превращаются в итераторы конца потока данных. Следовательно, после каждой операции чтения потоковый итератор ввода необходимо сравнивать с итератором конца потока данных и убеждаться в том, что он остался действительным. В табл. 7.10 перечислены все операции потоковых итераторов ввода. Таблица 7.10. Операции потоковых итераторов ввода 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 [ 88 ] 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 |