Анимация
JavaScript
|
Главная Библионтека Численные алгоритмы В этом разделе представлены алгоритмы STL, предназначенные для обработки числовых данных. Впрочем, с их помощью можно обрабатывать и другую информацию. Например, алгоритм accumulate() может применяться для конкатенации строк. Чтобы использовать числовые алгоритмы, в программу необходимо включить заголовочный файл <numeric>: #includG <nurner1c> Обработка интервалов Вычисление результата по одному интервалу accumulate (Inputlterator beg. Inputlterator end. T initValue) accumulate (Inputlterator beg. Inputlterator end. T initVdlue. BinaryFunc op) О Первая форма вычисляет и возвращает сумму initValue и всех элементов в интервале lbeg,end). Для каждого элемента выполняется команда: initValue = initValue + elem О Вторая форма вычисляет и возвращает накопленный результат вызова ор для initValue и каждого элемента в интервале [beg,end). Для каждого элемента выполняется команда: initValue = opdnitValue, elem) О Таким образом, пусть мы имеем следующие значения: al а2 аЗ а4,,, Для этих значений соответственно вычисляются и записываются такие величины: initValue + al + а2 + аЗ + .,. initValue ор al ор а2 ор вЗ ор ... О Для пустого интервала (beg end) обе формы возвращают initValue. О Предикат ор не должен модифицировать передаваемые аргументы. О Сложность линейная (numberOfElements вызовов оператора + или opQ соответственно). В исходной версии STL численные алгоритмы определялись в заголовочном файле <aIgo.h>. В следующем примере алгоритм accumulate() используется для вычисления суммы и произведения всех элементов интервала. algo/accul.cpp finclude "algostuff.hpp" using namespace std; int maln() { vector<int> coll; INSERTjLEMENTS(col 1.1.9); PRINTJLEMENTSCcoll): Вычисление суммы элементов cout « "sum; " « accumulate CcoU.beginO, coll.endC). Интервал 0) Начальное значение « endl; Вычисление суммы элементов с вычетом 100 cout « "sum: " « accumulate CcoU.beginO. coll.endC), Интервал -100) Начальное значение « endl; Вычисление произведения элементов cout « "product: " « accumulate Ccoll.beginC). coll.endC). Интервал 1. Начальное значение multiplies<int>C)) Операция « endl: Вычисление произведения элементов Сс начальным значением 0) cout « "product: " « accumulate Ccoll.beginC). coll.endC), Интервал 0. Начальное значение multiplies<int>C)) Операция « endl; Результат выполнения программы выглядит так: 1 2 3 4 5 6 7 8 9 sum: 45 sum: -55 product: 362880 product; О Последнее произведение равно нулю, поскольку при умножении любого числа на ноль результат равен нулю. Вычисление скалярного произведения двух интервалов 1nner procluct (Inputlteratorl begl. Inputlteratorl endl. Inputlterator? beg2. T initValue) inner product (Inputlteratorl begl. Inputlteratorl endl. lnputIterator2 beg2. T initValue. BinaryFunc opl. BinaryFunc op2) О Первая форма вычисляет и возвращает скалярное произведение initValue и элементов интервалов \beg,end) и [beg2,...). Для каждого элемента выполняется команда: initValue = initValue + eleml * elem2 О Вторая форма вычисляет и возвращает накопленный результат вызова ор для initValue и элементов интервала [beg,end), объединенных с элементами [beg2,...). Для каждого элемента выполняется команда: initValue = opl{initValue.op2{eleml .elem2)) О Таким образом, пусть мы имеем следующие значения: al а2 аЗ а4... Ы Ь2 ЬЗ ... Для этих значений соответственно вычисляются и записываются такие величины: imtValue + (al * bl) + (а2 * Ь2) + (аЗ * ЬЗ) + ... initValue opl (al ор2 bl) opl (a2 op2 b2) opl (аЗ op2 ЬЗ) opl .,. О Для пустого первого интервала (begl endl) обе формы возвращают initValue. О Перед вызовом необходимо убедиться в том, что интервал [beg2,...) содержит достаточное количество элементов. О Предикаты ор1 п ор2 не должны модифицировать передаваемые аргументы. О Сложность линейная (numberOfElements вызовов операторов + и * или numberOfElements вызовов op1Q и ор2() соответственно). В следующем примере алгоритм inner product() используется для вычисления суммы произведений и произведения сумм элементов двух интервалов. algo/innerl.cpp #include "algostuff.hpp" using namespace std: int mainO list<int> coll; INSERT ELEMENTS(coll.l.6): 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 |