Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
67
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Глава 13. Итераторы и функциональные объекты

339

class pointer_to_binary_function : public binary_function<Argl, Arg2, Result>{ public-explicit pointer_to_binary_function(Result (*f)(Argl, Arg2)); Result operator()(Argl x. Arg2 y) const;

}: template <class Argl. class Arg2, class Result> pointer_toJ)inary_function<Argl, Arg2, Result> ptr_fun(Result (*f)(Argl, Arg2));

Пример применения адаптера функции:

#include <iostream> #include <functional> #include <algorithm> using namespace std; struct A{ int x, y;

}:

bool lss(A al. A a2){return al.x < a2.x;}

int main(){

Ama[5] = {{2, 4}. {3. 1}. {2. 2}. {1. 2}. {1. 2}};

A elem = {3. 0};

cout « count_if(ma. ma + 5, bind2nd(ptr_fun(lss). elem));

return 0;

} Функция lss задает правило сравнения элементов структуры А. Алгоритм стандартной библиотеки count_Jf вычисляет количество элементов структуры та, удовлетворяющих условию, заданному третьим параметром. Этим параметром является функциональный объект, созданный связывателем bi nd2nd из функционального объекта, полученного из функции lss с помощью адаптера ptr_fun, и переменной, подставляемой на место второго параметра функции. В результате будет вычислено количество элементов структуры А, поле х которых меньше 3 (результат — 4).

В качестве второго примера рассмотрим вектор из объектов класса monstr, введенного ранее (см. с. 183). Приведенная ниже программа с помощью алгоритма стандартной библиотеки countjif (см. с. 345) вычисляет в векторе количество монстров, здоровье которых пошатнулось (допустим, что этот печальный факт имеет место при значении поля health < 30). Для краткости приведены только необходимые методы класса:

#include <iostream>

#include <vector>

#include functional>

#include <algorithm>

using namespace std;

enum color {red, green, blue};

class monstr{

int health, ammo;

340

Часть III. Стандартная библиотека

color skin;

char *name; public:

monstr(int he = 100, int am = 10);

monstr(color sk);

monstr(char * nam);

monstr(const monstr &M);

-monstrO {delete [] name;}

operator int(){return health;}

int get_health(){;return health;}

friend ostream&

operator «(ostream & out, monstr & m){ return out « "monstr: " « " ammo = "« m.ammo « " health = " « m.health «endl;}

}:

monstr::monstr(int he, int am):

health (he), ammo (am), skin (red), name (0){}

monstr::monstr(const monstr &M){

if (M.name){ name = new char [strlen(M.name) + 1];

strcpy(name, M.name);} else name = 0; health = M.health; ammo = M.ammo; skin = M.skin;

}

skin = red; name = 0; break; skin = green; name = 0; break; skin = blue; name = 0; break;

monstr::monstr(color sk){ switch (sk){ case red :

health = 1; ammo = 10 case green:

health = 2; ammo = 20 case blue:

health = 3; ammo = 40 }}

monstr::monstr(char * nam){

name = new char [strlen(nam) + 1]; strcpy(name, nam);

health = 200: ammo = 10; skin = red; }

bool lessjiealth (monstr ml, monstr m2){

return ml.getJiealthO < m2.get_health() ;}

int main(){

vector <monstr> m; monstr M (10. 30); m.push_back(M);