用binder2nd实现find_if算法中函数对像的参数传递
find_if 算法的定义如下:
template<class InputIterator, class T, class Predicate> inline
InputIterator find_if(
InputIterator First,
InputIterator Last,
Predicate Predicate
)
它和find算法很类似返回的是找到元素的佚代器。它的第三个参数是一个函数指针(function pointer)或函数对像(object functional)如果是函数对像,它的定义可以是这样。
template <class T>
class fun
{
public:
bool operator()(const T &a)const
{
if(a > 10)
return true;
}
};
这里实现了一个找出大于30的元素(当然元素不一不是int型的)这里是一个小例子:
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
#include "time.h"
using namespace std;
int _rand()
{
return rand()%100;
}
template <class T>
class fun
{
public:
bool operator()(const T &a)const
{
return a>30;
}
};
int main(int argc, char* argv[])
{
srand(time(NULL));
vector<int> vec(16);
generate(vec.begin(),vec.end(),_rand);
copy(vec.begin(),vec.end(),ostream_iterator<int>(cout," "));
cout << endl;
vector<int>::iterator itr =vec.begin();
while(itr != vec.end())
{
itr = find_if(itr,vec.end(),fun<int>());
if(itr != vec.end())
{
cout <<*itr << " ";
itr++;
}
}
return 0;
}
但是,如果我们要比较的数是一个在运行时改变的数,比如,第一次要找大去30的,第二次要找大于35的,这如何时实呢?对,binder2nd()!
它是一个模版类定义在<functional>头文件里。
template<class Operation>
class binder2nd
: public unary_function <
typename Operation::first_argument_type,
typename Operation::result_type>
{
public:
typedef typename Operation::first_argument_type argument_type;
typedef typename Operation::result_type result_type;
binder2nd(
const Operation& _Func,
const typename Operation::second_argument_type& _Right
);
result_type operator()(
const argument_type& _Left
) const;
result_type operator()(
argument_type& _Left
) const;
protected:
Operation op;
typename Operation::second_argument_type value;
};
怎么样,看晕了吧?简单说下_Func是要绑定的函数对象,_Right是要绑定的二原函数的第二个参数。那第一个参数呢?是留给find_if用的。这个函数对象从binary_function派生出来的,我们看看看binary_function的定义:
template<class Arg1, class Arg2, class Result>
struct binary_function {
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Result result_type;
};
它是一个用模版定义的类,用来对函数对象提供C++标准模版库的支持,first_argument_type 表示第一个参数类型,second_argument_type 表示第二个参数类型result_type表示返回值类型。C++库的函数对象都是从这个类派生出来的。
说了这么多怎么用它呢:我还是给个例子吧!功能和上面的差不多,找出大于30的数。看好了!
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
#include "time.h"
using namespace std;
template<class T>
class fun: public binary_function<T, T, bool>
{
public:
result_type operator() ( const first_argument_type a,const second_argument_type b ) const
{
return a>b;
}
};
int _rand()
{
return rand()%100;
}
int main(int argc, char* argv[])
{
srand(time(NULL));
vector<int> vec(16);
generate(vec.begin(),vec.end(),_rand);
copy(vec.begin(),vec.end(),ostream_iterator<int>(cout," "));
cout << endl;
vector<int>::iterator itr =vec.begin();
while(itr != vec.end())
{
itr = find_if(itr,vec.end(),binder2nd<fun<int> >(fun<int>(),30));
if(itr != vec.end())
{
cout <<*itr << " ";
itr++;
}
}
return 0;
}
最后,说下运行还境:windows xp sp2, VC++6.0