Анимация
JavaScript
|
Главная Библионтека
Объект функции lesso является критерием по умолчанию при сортировке или сравнении объектов, поэтому он используется достаточно часто. По умолчанию сортировка всегда проводится по возрастанию (элемент <следЭлемент). Чтобы использовать стандартные объекты функций, необходимо включить в программу заголовочный файл <functional>: #inc1ude <functional> В стандартную библиотеку С++ также входит специальный объект функции, который может использоваться при контекстной сортировке строк. За подробностями обрапщйтесь на с. 676. Функциональные адаптеры Функциональным адаптером называется объект, который позволяет комбинировать объекты функций друг с другом, с определенными значениями или со специальными функциями. Функциональные адаптеры тоже объявляются в заголовочном файле <functional>. Например, в следующей команде выражение bind2nd(greater<int>0,42) создает комбинированный объект функции для проверки условия «целое число больше 42*: find 1f (coll,beginO,coll .endO. Интервал b1nd2nd(greater<int>0.42)) Критерий Фактически bind2nd() преобразует бинарный объект функции (например, greatero) в унарный объект функции. Второй параметр всегда используется в качестве второго аргумента бинарной функции, передаваемой в первом параметре. Следовательно, в приведенном примере greatero всегда вызывается со В исходной версии STL заголовочный файл объектов функций назывался <function.h>. вторым аргументом, равным 42. На с. 140 имеются и другие примеры использования функциональных адаптеров. В табл. 8.2 перечислены классы стандартных функциональных адаптеров, входящих в стандартную библиотеку С++. Таблица 8.2. Стандартные функциональные адаптеры Выражение Описание
Функциональные адаптеры сами по себе являются объектами функций, поэтому их можно объединять с другими адаптерами и объектами функций для построения более мощных (и более сложных) выражений. Например, следующая команда находит первый четный элемент коллекции: роз = findjf (coll.beginO. coll.endO. Интервал notl(bind2nd(modulus<1 nt>0.2))): Критерий В этой команде выражение bind2nd(modulus<int>(),2) возвращает 1 для нечетных значений. Следовательно, оно может использоваться в качестве критерия для нахождения первого нечетного элемента, потому что значение 1 эквивалентно true. Адаптер notl() производит логическую инверсию результата, поэтому вся команда ищет первый элемент с четным значением. Объединяя объекты функций при помощи функциональных адаптеров, можно строить достаточно сложные выражения. Подобный стнль программирования называется функциональной композицией. Тем не менее в стандартной библиотеке С++ отсутствуют некоторые адаптеры, которые были бы весьма удобны при композиции. Например, отсутствуют адаптеры для связывания двух предикатов по условиям •«и»/«или» (например, «больше 4 и меньше 7р). Расширения стандартных функциональных адаптеров делают механизм композиции гораздо более мощным. Примеры таких расширений приведены на с. 313. Функциональные адаптеры для функций классов в стандартную библиотеку С++ включены дополнительные адаптеры, позволяющие вызвать некоторую функцию класса для каждого элемента коллекции (табл. 8.3). Таблица 8.3. Функциональные адаптеры для функций классов
В следующем примере адаптер mem fun ref вызывает функцию prrnt() каждого элемента вектора: fo/memfunla.cpp class Person { private: std::str1ng name: public; void print 0 const ( std::cout « name « std::endl; void printWithPrefix (std:;string prefix) const { std;:cout « prefix « name « std:;endl; void foo (const std::vector<Person>& coll) using std using std using std for each: bind2nd; mem fun ref: Вызов функции printO для каждого элемента вектора for each (coll.beginO. coll.endO. mem fun ref(&Person::print)): Вызов функции printWithPrefixO для каждого элемента - строка "person; " передается при вызове for each Ccoll .beginO, coll.endO. bind2nd(mem fun ref(&Person;;printWithPrefix), "person: ")); int mainO std::vector<Person> col 1(5); foo(con); std;;vector<Person*> col 12: con2,push back(new Person); ptrfoo(coll2); В функции foo() для каждого элемента вектора coll вызываются две функции класса Person: * О функция Person::print() вызывается без аргументов; О функции printWrthPrefixO при вызове передается аргумент. 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 |