STL中伪函数、函数对象(functor)初步理解(上)

伪函数或者函数对象只是翻译的问题,英文全部都是functor,还有些读物管这个叫函数符。functor作为C++ STL六大基本组件之一被广泛使用(其他五个分别是容器、演算法、迭代器、适配器、分配器),那么,functor的意义在哪里?或者说它有什么作用?


这项技术从概念上不难理解,伪函数也好,函数对象也好,都说明了它不是真正的函数,而是一种类似函数作用的东西,在STL里,我们经常需要对容器内元素进行批量操作,手写循环确实是个方法,但是,代码冗余,而且效率普遍偏低,这就需要一个批量操作方法,能够对容器内的元素进行批量操作,那么,怎么操作,操作什么,这就需要用户去定义了,你需要告诉程序,你想要什么样的操作,一般人对于这种问题的第一反应就是函数指针,确实,通过传递一个函数指针可以让程序执行特定的操作,这也确实是一个方法,但是按CPP Primer Plus上的原文来说,它有一个很大的弊端,那就是函数指针是必须指定参数以及返回类型的,而STL属于泛型编程,加入用函数指针来操作的话,是违反泛型思想的本质的,因此,这就需要一个能取代函数指针的东西了,而这个东西就是所谓的函数对象。


函数对象是一种介于对象和函数之间的一个东西,调用方式和函数一样,但是调用的却是对象里的operator ()操作符,这可以给程序带来三大好处。第一,面相对象里的模板机制对functor是完全适用的,因此用函数对象可以和STL完全兼容,换句话说,使用functor和泛型的思想相符。第二,函数对象本质上是对象,因此,一个函数对象可以使用类中所封装的所有数据,而对于函数指针来说,只能使用全局数据,所以,使用functor可以达到数据封装的目的。第三,functor往往是轻量级代码,因此,可以完美内联化,这对于程序效率的提升是非常有利的。基于以上三点,就不难理解为什么functor是STL六大组件之一。函数对象可以带来这么多好处,那么在STL编程中当然是要尽量多用了,那么现在问题来了,假如类在设计的时候没考虑到和STL的适配怎么办?这就需要用到STL functor适配器了,常见的适配器有三个:ptr_fun、mem_fun和mem_fun_ref。这三种适配器分别针对不同的对象,ptr_fun可以把一个全局函数转化成一个functor,后两者则分别针对面相对象中的函数和函数指针。


首先看第一个函数适配器,也就是ptr_fun,这个适配器可以把一个全局函数转化成一个functor,根据sgi上的解释,ptr_fun实际上是两个函数,当传递的函数具有一个参数的时候,ptr_fun会接受一个函数指针,然后返回一个unary_function类型的函数指针,而传递的函数具有两个参数的时候,它则会返回一个binary_function类型的函数指针。其实,ptr_fun并不神秘,同STL种大多数适配器一样,它只不过是让一些函数实现所需要的typedef生效而已,而其他两个适配器也是具有同样的作用。


另外两个适配器都是针对类中的函数,假如容器中所放的是实体,那么转换函数符的适配器应该使用mem_fun_ref,假如容器中所存放的是指针,那么函数符适配器应该使用mem_fun,这是二者唯一的区别。不论是mem_fun_ref还是mem_fun,都接受一个函数指针,然后返回一个函数符指针,由于global function本身就是一个函数指针,因此不需要做取址操作,但是对于对象来说,则必须加“&”操作符,也就是说,在mem_fun_ref内部,必须在函数名前面加上&,这样才可以达到传递指针的目的。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值