![]() |
|
Программирование >> Операторы преобразования типа
ния быстродействия. Для этого достаточно исключить из реализации remove if() вызов findjf(): template <class Forwlter. class Predicate> Forwiter std::remove 1f(Forwlter beg, Forwlter end, Predicate op) while Cbeg != end && !op(*beg)( ( ++beg: if Cbeg == end) ( return beg: else { Forwlter next = beg; return remove copy 1fC++next, end. beg. op); Вероятно, реализацию removeJf() стоило бы изменить (или подать заявку на ее изменение автору библиотеки). Насколько мне известно, в текущих реализациях эта проблема возникает только с алгоритмом removeJf(). Если использовать алгоритм remove copy if(), все работает нормально. Но если вы хотите, чтобы программа была действительно переносимой, никогда не полагайтесь на особенности реализации. Всегда объявляйте оператор вызова функции и предикаты как константные функции классов. Стандартные объекты функций Как упоминалось на с. 140, стандартная библиотека С++ содержит ряд стандартных объектов функций. Эти объекты перечислены в табл. 8.1. Таблица 8.1. Стандартные объекты функций Выражение Описание
продолжение В настоящее время обсуждается вопрос о том, должна ли стандартная библиотека С++ гарантировать ожидаемое поведение в подобных случаях. В предыдущих версиях STL объект функции, выполнявший умножение, назывался times. Переимепование произошло из-за конфликта имен с функциями стандартов операционных систем (Х/Ореп, POSIX), а также потому, что идентификатор multiplies понятней.
Объект функции lesso является критерием по умолчанию при сортировке или сравнении объектов, поэтому он используется достаточно часто. По умолчанию сортировка всегда проводится по возрастанию (элемент <следЭлемепт). Чтобы использовать стандартные объекты функций, необходимо включить в программу заголовочный файл <functional>: #inc1ude <functional> В стандартную библиотеку С++ также входит специальный объект функции, который может использоваться при контекстной сортировке строк. За подробностями обрапщйтесь на с. 676. Функциональные адаптеры Функциональным адаптером называется объект, который позволяет комбинировать объекты функций друг с другом, с определенными значениями или со специальными функциями. Функциональные адаптеры тоже объявляются в заголовочном файле <functional>. Например, в следующей команде выражение bind2nd(greater<int>(),42) создает комбинированный объект функции для проверки условия целое число больше 42*: find 1f (coll,beginO,coll .endO. Интервал bind2nd(greater<1nt>0.42)) Критерий Фактически bind2nd() преобразует бинарный объект функции (например, greatero) в унарный объект функции. Второй параметр всегда используется в качестве второго аргумента бинарной функции, передаваемой в первом параметре. Следовательно, в приведенном примере greatero всегда вызывается со В исходной версии STL заголовочный файл объектов функций назывался <function.h>. вторым аргументом, равным 42. На с. 140 имеются и другие примеры использования функциональных адаптеров. В табл. 8.2 перечислены классы стандартных функциональных адаптеров, входящих в стандартную библиотеку С++. Таблица 8.2. Стандартные функциональные адаптеры Выражение Описание
Функциональные адаптеры сами по себе являются объектами функций, поэтому их можно объединять с другими адаптерамн и объектами функций для построения более мощных (и более сложных) выражений. Например, следующая команда находит первый четный элемент коллекции: роз = findjf (coll.beginO. coll.endC). Интервал notlCbind2nd(modulus<1 nt>().2))): Критерий В этой команде выражение blnd2nd(modulus<int>(),2) возвращает 1 для нечетных значений. Следовательно, оно может использоваться в качестве критерия для нахождения первого нечетного элемента, потому что значение 1 эквивалентно true. Адаптер notl() производит логическую инверсию результата, поэтому вся команда ищет первый элемент с четным значением. Объединяя объекты функций при помощи функциональных адаптеров, можно строить достаточно сложные выражения. Подобный стнль программирования называется функциональной композицией. Тем не менее в стандартной библиотеке С++ отсутствуют некоторые адаптеры, которые были бы весьма удобны при композиции. Например, отсутствуют адаптеры для связывания двух предикатов по условиям и / или (например, больше 4 и меньше 7р). Расширения стандартных функциональных адаптеров делают механизм композиции гораздо более мощным. Примеры таких расширений приведены на с. 313. Функциональные адаптеры для функций классов в стандартную библиотеку С++ включены дополнительные адаптеры, позволяющие вызвать некоторую функцию класса для каждого элемента коллекции (табл. 8.3). Таблица 8.3. Функциональные адаптеры для функций классов
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |