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 что дает


<< назад вперед >>