Программирование >>  Немодифицирующие последовательные алгоритмы 

1 ... 43 44 45 [ 46 ] 47 48 49 ... 78


чтобы указать, что мы хотим считать только значения, меньшие 100. Следующая программа показывает, как это все работает:

binder.срр: Использование адаптера bind2nd для подсчета, сколько из элементов массива меньше, чем 100.

♦include <iostream> ♦include <algorithm> ♦include <functional> using namespace std;

int main()

{ int a[10] = {800, 3, 4, 600, 5, 6, 800, 71, 100, 2}, n = 0;

n = count if(a, a + 10, bind2nd(less<int>(), 100)); cout n endl; Вывод: 6 return 0;

Для привязывания первого аргумента существует привязка bindXst. К примеру, заменим условие х < 100 эквивалентным условием

100 >х

Этого можно добиться, привязав первый операнд у выражения у > X

к значению 100. Следовательно, программа binder.cpp выдаст тот же результат, если мы заменим вызов count if на следующий:

п = count if(a, а + 10, bindlst(greater<int>(), 100));

Мы не будем подробно обсуждать реализации адаптеров bindlst и bindlnd, потому что их определения сложнее, чем использование в программах.

6.3. Отрицатели

Программисты часто используют унарный оператор ! (не). Например, выражение

!(X < у)

эквивалентно

X >= у

Подобным же образом на функции двух аргументов действует отрицатель not2. Отрицатель является еще одной разновидностью адаптера функции; он реализуется в виде шаблонной функции, которая принимает в качестве аргумента объект, являющийся бинарным предикатом, например less<int>. Мы, следовательно, можем написать



not2(less<int>()) вместо

greater equal<int>

Это выражение используется в следующей программе. Она сортирует массив из пяти элементов в нисходящем порядке:

not2demo.cpp: Пример использования адаптера not2. #include <iostream> iinclude <algorithm> iinclude <functional> using namespace std;

int mainO

{ int a[5] = {50, 30, 10, 40, 20}; sort(a, a+5, not2(less<int>())); for (int i=0; i<5; i++) cout a[i] ; Вывод: 50 40 30 20 10 cout endl; return 0;

Приведенный выше вызов алгоритма sort можно заменить на

sort(а, а+5, greater equal<int>()); ИЛИ просто

sort(а, а+5, greater<int>());

Адаптер функции notl изменяет унарные предикаты. Так как адаптеры bindist и bindlnd возвращают унарный предикат, выражение типа

bind2nd(less<int>(), 100)

является приемлемым аргументом для адаптера not\, как показывает следующая программа:

notldemo.cpp: Пример использования адаптера notl. iinclude <iostream> iinclude <algorithm> iinclude <functional> using namespace std;

int main()

{ int a[10] = {800, 3, 4, 600, 5, 6, 800, 71, 100, 2}, n = 0;

Подсчитаем, сколько имеется элементов не меньше 100: п = count if(а, а + 10,

notl(bind2nd(less<int>(), 100)));



cout п endl; Вывод: 4 return 0;

Отметим, что подсчет числа элементов массива, равных или превышающих 100, может быть произведен с помощью более простого вызова алгоритма count if:

п = count if(a, а + 10,

bind2nd(greater equal<int>(), 100) ) ;

В любом случае будет выведено число 4, поскольку ровно четыре элемента (800, 600, 800, 100) массива а не меньше 100.

6.4. Два полезных базовых класса STL

Могли ли мы найти более простой пример для обсуждения адаптера notl, чем

sort(a, а+5, not2(less<int>()));

встречающийся в программе not2demo.cpp в предыдущем разделе? В частности, можем ли мы применить not2 к написанному нами функциональному объекту, например, таким образом:

sort(а, а+5, not2(iLessThen()));

если iLessThen - функциональный класс, определенный как

struct ILessThen { ???

bool operator!)(int x, int у)const {return x < y;}

Однако нам не удастся откомпилировать этот код. Адаптер not2 требует, чтобы его параметр шаблона был классом, производным от шаблонного класса binary function, который упоминался в разделе 6.1. Этого легко добиться, добавив

: binary function<int, int, bool>

Сразу после имени класса iLessThen в приведенном выше объявлении этого класса. Три параметра шаблона int, int и bool соответствуют типам двух аргументов и результата, которые можно было бы использовать при объявлении обычной функции для тех же целей, такой как

bool lessthan(int х, int у) {return х < у;}

Используя binary Junction<int, int, bool> в качестве базового класса для iLessThen, можно написать следующую программу, эквивалентную программе not2demo.cpp из предыдущего раздела:



1 ... 43 44 45 [ 46 ] 47 48 49 ... 78

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика