Анимация
JavaScript
|
Главная Библионтека /* INSERTJLEMENTS (collection, first, last) * - заполнение коллекции значениями от first до last * - ВНИМАНИЕ; интервал НЕ ЯВЛЯЕТСЯ полуоткрытым */ template <class J> inline void INSERTJLEMENTS (T& coll. int first, int last) { for (int i=first: i<=last; ++i) { coll лnsert(coll .endO .1); #endif /*ALGOSTUFFJPP*/ Сначала в файл agostuff.hpp включаются все заголовочные файлы, которые могут быть задействованы в примерах, чтобы их не пришлось включать отдельно. Затем определяются две вспомогательные функции. О Функция PRINT ELEMENTS() выводит все элементы контейнера, переданного в первом аргументе, разделяя их пробелами. Второй необязательный аргумент определяет префикс - строку, которая будет выводиться перед элементами (см. с. 128). О Функция INSERT ELEMENTS() вставляет элементы в контейнер, переданный в первом аргументе. Элементам присваиваются значения в интервале, гратш-цы которого определяются вторым и третьим аргументами. В данном случае включаются оба аргумента (поэтому интервал не является полуоткрытым). Алгоритм for each Алгоритм for each() обладает чрезвычайно гибкими возможностями. С его помощью можно производить разнообразную обработку и модификацию каждого элемента. UnaryProc for each (Inputlterator beg. Inputlterator end, UnaryProc op) О Вызывает унарный предикат op{elem) для каждого элемента elem в интервале [beg,end). О Возвращает копию ор (измененную в процессе выполнения). О Операция ор может модифицировать элементы. На с. 325 алгоритм fcr each() сравнивается с алгоритмом transformO. который решает ту же задачу, но несколько иным способом. О Возвращаемые значения ор игнорируются. О Реализация алгоритма for each() приведена на с. 135. О Сложность линейная (numberOfElements вызовов ор). В следующем примере алгоритм for each() вызывает для каждого элемента функцию print(), которая выводит текущее значение элемента. algo/foreachl.cpp #lnclude "algostuff.hpp" using namespace std: Функция, вызываемая для каждого элемента void print (int elem) cout « elem « : int mainO { vector<int> coll: INSERT ELEMENTS(coll.l.9): call printO for each element for each (coll.beginO. coll.endO. Интервал print): Операция cout « endl: Программа выводит следующий результат: 123456789 Чтобы вызвать для каждого элемента функцию его класса, необходимо использовать адаптеры mem fun. За подробностями и примерами обращайтесь на с. 307. В следующем примере объект функции модифицирует элементы в процессе перебора: algo/foreach2.cpp #include "algostuff.hpp" using namespace std; Объект функции прибавляет к значению элемента приращение. заданное при его инициализации template <clas5 Т> class AddValue { private: Т theValue: Приращение public: Конструктор инициализирует приращение AddValue (const Т& v) ; theValue(v) { } Суммирование выполняется "вызовом функции" для элемента void operatorO (Т& elem) const { elem += theValue: int mainO { vector<int> col 1; INSERT ELEMENTS(coll,1.9); Прибавить к каждому элементу 10 for each (coll.beginO. coll.endO. Интервал AddValue<int>(10)); Операция PRINT ELEMENTS(coll): Прибавить к каждому элементу значение первого элемента for each (coll.beginO, coll.endO. range Add\/alue<int>(*coll,beginO)); operation PRlNT ELEMENTS(coll): Класс AddValueO определяет объекты функций, которые прибавляют к каждому элементу приращение, переданное при вызове конструктора. Используя объект функции, вы сможете определить величину приращения на стадии выполнения программы. Результат выполнения программы выглядит так: 11 12 13 14 15 16 17 18 19 22 23 24 25 26 27 28 29 30 Подробное описание этого примера приведено на с. 138. Задача таюке решается при помощи алгоритма transformQ (см. с. 363): transform (coll.beginO. coll.endO. Источник coll .beginO , Приемник bind2nd(plus<1nt>().10)); Олерация transform (coll.beginO. coll.endO. Источник coll .beginO. Приемник b1nd2nd(plus<1nt>0 ,*coll .beginO)): Операция Ha c. 325 приведен общий сравнительный анализ алгоритмов fcr each() и transform(). В третьем примере используется значение, возвращаемое алгоритмом for each(). Особое свойство for each() - возвращение выполняемой операции - позволяет выполнить необходимые вычисления и вернуть результат в объекте функции. algo/foreachS.cpp #1nclude "algostuff,hpp" using namespace std; Объект функции для вычисления среднего арифметического class MeanValue { private: long num: Счетчик элементов long sum; Сумма всех значений элементов 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 |