仿函数(functor) 是什么
说的通俗点就是:一个类重写了()运算符,该class创建出来的对象
,这个对象就是函数对象(它是一个对象,但是像一个函数,因此叫做仿函数)
仿函数的 功能
仿函数是为alogrithm服务的,用于为alogrithm指定大小比较的准则,常见的算法包括:for_each、sort、count_if、find_if、min_element、remove_if
alogrithm分类
以上alogrithm根据能接收形参的个数是1个还是2个,划分为2类,如下图:
alogrithm接收两个 形参的API | alogrithm接收一个 形参的API |
---|---|
sort | for_each、count、count_if 、remove_if |
functor分类
同样,STL自带的仿函数
根据能接收形参的个数是1个还是2个也分为2类,即:一元仿函数、二元仿函数。
自定义
仿函数对象
仿函数常被用于定义比较大小的规则,通常情况下,创建仿函数类 & 重写 bool operator(…,…)函数 → → → 参考文章《 STL & 自定义比较器
》的 ② 、④、⑤ 。
仿函数适配器
& Binders
[1] bind1st、bind2nd 将一个二元函数对象functor(param1,param2)的某个参数 绑定 一个value,从而转换成一元函数对象
- bind1st (二元仿函数对象functor(param1,param2), value)
<==>
一元仿函数对象functor(value
,param2) - bind2nd(二元仿函数对象functor(param1,param2), value)
<==>
一元仿函数对象functor(param1,value
)
[代码案例1]
count_if(v.begin(), v.end(), bind1st(less<int>(), 4) )
1. 使用bind1st将二元函数对象绑定为一元函数对象,即:bind1st(less<int>(), 4)) ←→ less<int>(4, param)
2. count_if 依次取出每个元素,放入param中
[代码案例2]
count_if(v.begin(), v.end(), bind2nd(less<int>(), 4) )
1. 使用bind2nd将二元函数对象绑定为一元函数对象,即:bind1st(less<int>(), 4)) ←→ less<int>(param, 4)
2. count_if 依次取出每个元素,放入param中
[2] not1( 一元函数对象functor(param) )
count_if(v.begin(), v.end(), not1( bind2nd (less<int>(), 3))
);
[3] not2( 二元函数对象functor(param1, param2) )
C++11 & std::bind | std::function
bind1st、bind2nd在实际应用中存在缺陷,为了更加具有普适性,C++11提出了 std::bind 和 占位符 ,用于绑定 多个参数
的函数对象。 参考链接 →→→ C++11 & std::bind | std::function