- 函数对象。本质是一个对象,但是使用和函数一样,因为函数对象重载了()运算符。
- 函数对象和泛型算法结合使用
排序比较器
less
" < "
template<typename T>
class Mless
{
public:
bool operator()(T a, T b)
{
cout << "operator()" << endl;
return a < b;
}
};
greater
" >"
template<typename T>
class Mgreater
{
public:
bool operator()(T a, T b)
{
cout << "operator()" << endl;
return a > b;
}
};
绑定器
- 绑定器的作用就是给函数对象绑定参数
- 绑定器自身就是一个对象
- 绑定器想要给函数对象把参数绑定起来,因此就需要先将函数对象存起来;再将需要绑定的参数存起来
- 按照函数对象相同的方式,绑定器自己也变成一个函数对象,当绑定器自己的函数对象被调用时,再把传进来的函数对象进行调用,拿来调用的同时把需要绑定的值放在需要绑定的位置,另外的参数由外界传进来
bind1st
自实现myBinder1st()
bind2nd
// < 10
// 调用binder2nd的构造函数,构造一个对象传递给find_if
// binder2nd构造函数有2个参数:less函数对象;需要进行比较的值
vector<int>::iterator it1=find_if(v1.begin(), v1.end(), binder2nd <less<int>>(less<int>(), 12));
// binder2nd:是一个模板,意思是绑定对象的第二个参数
// 绑定less对象的第二个参数,因为less是函数对象,是2个参数的函数对象
// 使用binder2nd给less函数对象绑定第二个参数为10
if (it1 == v1.end())
{
cout << " not find " << endl;
}
else
{
cout << *it1 << endl;
}
标准库里的less
自实现myBinder2nd()
template<typename T>
class Myless
{
public:
typedef T TYPE_FIRST;
typedef T TYPE_SECOND;
typedef bool TYPE_RET;
bool operator()(T a, T b)
{
cout << "operator()" << endl;
return a < b;
}
};
template<typename PRE>
class myBinder2nd//绑定器的作用就是给函数对象绑定参数
{
public:
myBinder2nd(PRE pre, typename PRE::TYPE_SECOND val)//第一个参数是函数对象,第二个参数是一个未知类型的值
:_pre(pre),_val(val)
{
}
typename PRE::TYPE_RET operator()(typename PRE::TYPE_FIRST tmp)//因为使用到的是模板里面的类型所以需要加typename
{
//cout << "operator()" << endl;
return _pre(tmp, _val);
}
private:
PRE _pre;//函数对象
typename PRE::TYPE_SECOND _val;
};
template<typename IT, typename PRE>
IT myFind_if(const IT& first, const IT& last, PRE pre)
{
IT tmp = first;
while (tmp != last)
{
if (pre(*tmp))
{
return tmp;
}
tmp++;
}
return last;
}