Анимация
JavaScript
|
Главная Библионтека Ключевое слово typename указывает, что const iterator - тип, а не значение типа Т (см. с. 27). Помимо типов iterator и const iterator контейнеры предоставляют и другие типы, упрощающие написание унифицированных функций. В частности, они предоставляют тип элементов для выполнения операций с временными копиями элементов. За подробностями обращайтесь >ia с. 289. Необязательный второй аргумент функции PRINT ELEIENTS представляет собой строковый префикс, выводимый перед содержимым контейнера. Так, функция PRINT ELEIENTS() позволяет снабжать выходные данные комментариями: PRINTJLEMENTS (coll. "ell elements: "): Эта функция будет еще часто использоваться в книге для вывода всех элементов контейнера одной простой командой. Передача функций алгоритмам в качестве аргументов Некоторым алгоритмам могут передаваться пользовательские функции, которые вызываются в процессе внутренней работы алгоритма. Такая возможность делает алгоритмы еще более гибкими и мощными. Примеры передачи функций в аргументах алгоритмов Передачу функции проще всего рассматривать на примере алгоритма for each(), вызывающего пользовательскую функцию для каждого элемента в заданном интервале. stl/foreach.cpp include <iostream> include <vector> linclude <algor1th[ii> using namespace std; Функция 8Ы80ДИТ передзнный аргумент void print CInt elem) cout « elem « ; Int maInC) { vector<int> coll: Вставка элементов со значениями от 1 до 9 for CInt 1=1; 1<=9: ++1) { coll.push back(i Вывод всех элементов for each СсоП.beginO. coll.endO. Интервал print): Операция cout « endl; Алгоритм for each() вызывает функцию print() для каждого элемента в интервале [coll.beginQ,coll.endQ). Результат выполнения программы выглядит так: 1 2 3 4 5 6 7 8 9 Существует несколько вариантов применения пользовательских функций алгоритмами; в одних случаях передача функция обязательна, в других - нет. В частности, пользовательская функция может определять критерий поиска, критерий сортировки или преобразование, применяемое при копировании элементов из одной коллекции в другую. Другой пример: stl/transforml.срр linclude <iostream> linclude <vector> linclude <set> linclude <algor1thm> linclude "print.hpp" int square (Int value) ( return valuG*value: int main() ( std::set<int> colli: std::vector<1nt> Coll2; Вставка элементов со значениями от 1 до 9 в colli for (int 1=1: 1<=9; ++i) { colli.insert(i): PRINT ELEMENTS(C0l11."initialized: "); Преобраэовоание каждого элемента при копировании из colli в со112 - square transformed values std::transform (coll 1,beg1n().colli.endO, Источник std::back inserter(coll2), Приемник square): Операция PRINTJLEMENTS(col 12. "squared: "): В приведенном примере функция square() возводит в квадрат каждый элемент colli при его копировании в со112 (рис. 5.8). Результат выполнения программы выглядит так: Initialized; 123456789 squared: 1 4 9 16 25 36 49 64 81
1ntsquare(1ntvalue) returnvaluevaluG; Рис. 5.8. Работа алгоритма transform() Предикаты Особую разновидность вспомогательных функций, используемых алгоритмами, составляют предикаты. Предикатом называется функция, которая возвращает логическое значение. С помощью предикатов часто определяют критерии сортировки или поиска. В зависимости от способа применения предикаты делятся на унарные и бинарные. Учтите, что не любая унарная или бинарная функция, возвращающая логическую величину, является действительным предикатом. STL требует, чтобы при неизменности входных данных предикат всегда давал постоянный результат. Тем самым из категории предикатов исключаются функции, внутреннее состояние которых изменяется в процессе вызова. За подробностями обращайтесь на с. 303. Унарные предикаты Унарный предпкат проверяет некоторое свойство одного аргумента. Типичный пример - функция, используемая в качестве критерия поиска первого простого числа: stl/primel.cpp linclude <iostream> linclude <list> include <algorithm> linclude <cstdlib> для absO using namespace std: Предикат проверяет, является ли целое число простым bool isPrime (int number) 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 |