|
Программирование >> Немодифицирующие последовательные алгоритмы
чтобы указать, что мы хотим считать только значения, меньшие 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 из предыдущего раздела:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |