Анимация
JavaScript


Главная  Библионтека 

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

/* Копирование элементов colli в со112

* - используем конечный итератор вставки.

* чтобы вместо замены производилась вставка зленентов */

сору (colli.beginO , colli.endO, Источник

backJnserter(coll2)): Приемник

/* Вывод элементов col 12

* - копирование элементов в cout

* с использованием потокового итератора вывода */

сору (со112.beginO. coll2.endO. Источник

ostream iterator<int>(cout. ")): Приемник cout « endl;

/* Копирование элементов colli в со112 в обратном порядке

* - на этот раз с заменой */

сору (colli.rbeginO. colli.rendO. Источник

C0112.beginO): Приемник

Повторный вывод злементов col 12 сору (col 12.beginO . coll2.endO. Источник

ostreamJterator<int>(cout." ")): Приемник cout « endl:

В этом примере конечный итератор вставки (см. с. 275) вставляет элементы в приемный интервал. Без применения итераторов вставки алгоритм сору() начинает замену в пустой коллекции со112, что приводит к непредсказуемым последствиям. При использовании потоковых итераторов вывода (см. с. 281) в качестве приемника используется стандартный выходной поток.

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

1 2 3 4 5 6 7 6 9 9 В 7 6 5 4 3 2 1

Следующий пример демонстрирует различия между алгоритмами сору() и сору backward():

algo/copy2.cpp include "algostuff.hpp" using namespace std;

int mainO {

/* Инициализация исходной коллекции символами

* "..........abcdef.........."

vector<char> sourceOO..); for (int c=a; c<="f: С++) { source. push back(c)



source.1nsert(source.end().10..); PRINT ELEMENTS(source."source; "):

Копирование всех букв с позиции за три элемента перед а" vector<char> с1(source,begin().source.endO): copy (cl.begin()+10, cl,begin()+16, Исходный интервал cl.beg1n()+7): Приемный интервал

PRINTJLEMENTS (Cl."cl; ");

Копирование всех букв с позиции через три элемента после f vector<char> c2(source.begin().source.end()); copy backward (c2.beg1n()+10. c2,begin()+16. Источник c2.begin()+19); Приемник

PRINT ELEMENTS(c2."c2: "):

Обратите внимание: в обоих вызовах сору() и copy backward() третий аргумент не входит в источ:ник. Результат выполнения программы выглядит так:

source..........abcdef..........

cl; .......abcabcdef..........

c2: .......... abcabcdef .......

В третьем примере алгоритм сору() обеспечивает фильтрацию данных между стандартными входным и выходным потоками. Программа читает строки и выводит их по одной в каждой строке:

algo/соруЗ.срр #1nclude <iostream> #include <algor1th[n> #1nclude <string> using namespace std;

int rrainO (

copy (istream iterator<string>(cin). Начапо источника

istream iterator<str1ng>(), Конец источника

ostream iterator<string>(cout."\n")); Приемник

Преобразование и объединение элементов

Алгоритм transformO существует в двух вариантах:

О первая форма вызывается с четырьмя аргументами и преобразует элементы при копировании из источника в приемник (то есть модификация осуществляется одновременно с копированием);

О вторая форма вызывается с пятью аргументами, она объединяет элементы из двух источников и записывает результат в приемник.



Преобразование элементов

Outputlterator

transform (Inputlterator sourceBeg, Inputlterator sourceEnd. Outputlterator destBeg. UnaryFunc op)

О Вызывает предикат op{elem) для каждого элемента в исходном интервале [sourceBegySourceEnd) и записывает каждый результат ор в приемный интервал, начиная с destBeg:

О Возвращает позицию за последним преобразованным элементом в приемном интервале (то есть позицию первого элемента, не перезаписанного в результате операции).

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

О Позиции sourceBeg и destBeg могут быть идентичными. Это означает, что алгоритм transformO, как и for each(), может использоваться для модификации элементов внутри интервала. Пример для алгоритма for each() приведен на с. 325.

О Чтобы заменить заданной величиной элементы, удовлетворяющие критерию, используйте алгоритм replaceO (см. с. 369).

О Сложность линейная (numberOfElements присваиваний).

Следующая программа демонстрирует использование данной формы алгоритма transformO:

algo/transfl.cpp #include "algostuff.hpp" using namespace std:

1nt mainO {

vector<int> colli; list<int> C0112;

INSERT ELEMENTS(colU,l,9); PRINT ELEMENTS(col11."colli: ");

Изменение знака всех элементов colli

transform (colli.beginO. colli.endO. Источник

coin.beginO. Приемник

negate<int>()); Операция

PRINT ELEMENTS(col11."negated: "):

Копирование злементов colli, умноженных на 10. в col 12 transform (col П. beginO. col U.endO. Источник



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