Анимация
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

Чтобы передать объект функции по ссылке, достаточно уточнить вызов алгоритма так, чтобы тип объекта функции представлял собой ссылку Пример:

fo/genera2.cpp linclude <iostrearn> #include <li5t> #include <algorithin> #include "print.hpp" using namespace std;

class IntSequence ( private:

int value; public: Конструктор

IntSequence (int initialValue) : value(initialValue) {

"Вызов функции" int operatorO О { return value++;

int mainO

list<int> coll:

IntSequence seqCl); Серия целых чисел, начинающаяся с 1

Вставка значений от 1 до 4

- передача объекта функции по ссылке,

чтобы при следующем вызове значения начинались с 5

generate n<back i nsert lterator<li st<i nt> >,

int. IntSequence&>(back inserterCcoll). Начало 4, Количество злементов seq); Генератор значений,

PRiNTJLEMENTSCcoll);

Вставка значений от 42 до 45

generate n Cback inserter(coll). Начало

4. Количество элементов

IntSequenceC42)): Генератор значений

PRiNTJLEMENTSCcoll);

Продолжение первой последовательности - передача объекта функции по ссылке. чтобы при следующем вызове значения снова начинапись с 5

Спасибо Филипу Кестеру (Philip Kiister), указавшему на эту возможность.



generate n (bacl< lnserter(con). Начало

4. Количество элементов

seq); Генератор значений

PRINTJLEMENTSCcoll);

Снова продолжить первую последовательность

generatej Cback 1nserter(coll). Начало

4. Количество элементов

seq); Генератор значений

PRINTJLEMENTSCcoll):

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

1 2 3 4 42 43 44 45

1 2 3 4 42 43 44 45 5 6 7 8

1234 42 43 44 45 56785678

При первом вызове generate n() объект функции seq передается по ссылке, для чего производится уточнение аргументов шаблона:

generate n<back insert 1terator<l1st<1nt> >.

int. IntSeqLience&>(back inserter(coll). Начало 4. Количество элементов seq); Генератор значений

В результате внутреннее значение seq изменяется после вызова, а второе использование seq при третьем вызове generate n() продолжает серию из первого вызова. Но на этот раз seq передается по значению, а не по ссылке:

generate n (back 1nserter(coll). Начало

4. Количество элементов

seq); Генератор значений

Следовательно, вызов не изменяет внутреннего состояния seq, поэтому следующий вызов generate n() снова продолжает серию, начиная с 5.

Возвращаемое значение алгоритма for each

Благодаря алгоритму for each() хлопоты с реализацией объекта функции на базе подсчета ссылок для получения его итогового состояния оказываются излишними. Алгоритм for each() обладает уникальной особенностью - он возвращает свой объект функции (другие алгоритмы этого делать не могут). Это означает, что вы можете получить информацию о состоянии объекта функции, проверяя возвращаемое значение алгоритма for eacb().

Следующая программа хорошо поясняет, как использовать возвращаемое значение алгоритма for each(). В ней вычисляется среднее арифметическое числовой последовательности.

fo/foreach3.cpp include <1ostream>



#lnclLide <vector> #inc1ude <algor1thm> using namespace std:

Обьект функции для вычисления среднего арифметического class MeanValue ( private:

long num: Счетчик элементов long sum: Сумма всех значений элементов public: Конструктор

MeanValue () : num(O). sum(O) { }

"Вызов функции"

- обработка очередного элемента последовательности void OperatorO (int elem) (

num++; Увеличение счетчика

sum += elem: Прибавление значения

Возвращение среднего арифметического double value () {

return static cast<double>Csum) / static cast<double>(num);

int mainO (

vector<int> coll:

Вставка элементов от 1 до 8 for (int 1=1; i<=8; ++1) { coll.push back(i);

Вычисление и вывод среднего арифметического MeanValue mv = for each (coll.beginO. coll.endO. Интервал

MeanValueO); Операция

cout « "mean value: " « mv.valueO « endl;

Вызов MeanValueO создает объект функции, который подсчитывает количество элементов и вычисляет сумму их значений. Передача этого объекта при вызове for„eachO обеспечивает его вызов для каждого элемента контейнера соН;

MeanValue mv = for each (coll.beginO. coll.endO.

MeanValueO);



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