2.4. Функциональные объекты, определенные в STL
Напомним, что такие функции, как found (в предыдущем разделе), называются предикатами. Они возвращают true или fake в зависимости от соблюдения некоторого условия. Выражение greater<int>, которое встретилось нам в разделе 1.11, также является предикатом, но определенным в STL в виде шаблона. Напомним также, что для сортировки последовательности в нисходящем порядке мы использовали это выражение в вызове
sort(a, a+N, greater<int>());
В разделе 2.1 мы применяли похожее выражение multiplies<int>() в следующем вызове, чтобы указать необходимость выполнения умножения:
int prod = accumulate(a, a+N, 1, multiplies<int>());
Ниже дан полный список таких шаблонов (определенных в заголовке functional), соответствующих стандартным бинарным операциям:
plus<T> minus<T>
multiplies<T> divides<T> modulus<T>
equal_to<T> not_equal_to<T>
greater<T> less<T>
greater_equal<T> less_equal<T>
logical_and<T> logical_or<T>
Как известно, выражения типа plus<T>() являются объектами, другими словами, вышеперечисленные шаблоны, сопровожденные парой круглых скобок,- стандартные функциональные объекты, определенные в библиотеке STL. Кроме этого, существуют шаблоны, соответствующие унарным операторам - (как в выражении -х) и ! (произносится не):
negate<T> logical_not<T>
Теперь вернемся к программе countvw2.cpp в конце предыдущего раздела. Она содержит вызов
int n = count_if(p, p + strlen(p), found);
где found - определенная нами функция, указывающая, какие символы необходимо подсчитывать. Предположим, что теперь мы хотим подсчитать все символы ch >= 'к'. Очевидно, мы могли бы заменить found на следующую функцию:
bool found(char ch) { return ch >= 'k' ; }
Вместо этого возможно использовать упомянутый шаблон greater_equal<T>, но нам нужен способ связать greater_equal<ckar> со значением 'k'. Это достигается с помощью записи
bind2nd(greater_equal<char>(), 'к')
Указанное выражение может заменить имя функции found в рассматриваемом вызове count_if что дает
<< назад вперед >>