8 STL仿函数(函数对象)

8 STL仿函数(函数对象)

8.1 仿函数特性

重载operator()。

拥有状态;每个仿函数都有其型别(type);速度比函数指针快。


仿函数都是pass by value,好处是可以传递常量和临时表达式(如传递Sequence(1)),缺点是无法存取和改变其最终状态。

解决方法:(1)以by refrerence的方式传递仿函数(通过将模板参数显示标示); (2)运用for_each()算法的返回值。

for_each()可以返回其仿函数:

如MeanValue mv = for_each(coll.begin(), coll.end(), MeanValue());  //假设MeanValue为函数对象,即仿函数


注意:不应该传递一个“行为取决于被拷贝次数或被调用次数”的仿函数(因为算法有时会复制一个副本),也就是说判断式(返回布尔值的一个函数或仿函数)不应该因为被调用而改变自身状态。解决方法:将对应operator()声明为const成员函数。


8.2 预定义的仿函数——<functional>


1、函数配接器(function adapter)——能够将仿函数和另一个仿函数(或某个值)结合起来的仿函数

bind1st(op, value); //op(value, param)
bind2st(op, value); //op(param,value)
not1(op);           //!op(param)
not2(op);           //!op(param1, param2)

2、常成员函数的函数配接器(此版本不支持non-const成员函数)


如for_each(coll.begin(), coll.end(), mem_fun_ref(&Person::print);  //print()为Person类中的常成员函数(无参数),我们不能直接传递成员函数

for_each(coll.begin(), coll.end(), bind2nd(mem_fun_ref(&Person::printWithPrefix), "Person:")); //printWithPrefix()有一个参数

区别:mem_fun()要求coll的元素是Person*(指针),而mem_fun_ref要求coll的元素是Person对象。


3、针对一般函数(非成员函数)的函数配接器

使用ptr_fun将普通函数(1、2个参数, 如果有多个参数, 要改用boost::bind)适配成bind1st或bind2nd能够使用的functor,否则对bind1st或bind2nd直接绑定普通函数,则编译出错。

ptr_fun(op) ; //op(param)或op(param1, param2)

如pos = find_if(coll.begin(), coll.end(), not1(ptr_fun(check)));   //check为一般函数


4、让自定义仿函数也可以使用函数配接器

必须提供一些型别成员来反映其参数和返回值的型别。可以让自定义仿函数继承自struct unary_function或struct binary_function。


8.3 辅助用(组合型)仿函数



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值