[STL]函数对象/仿函数
来源:互联网 发布:马蓉淘宝店铺 编辑:程序博客网 时间:2024/05/22 02:21
什么是函数对象
顾名思义,函数对象首先是一个对象,即某个类的实例。其次,函数对象的行为和函数一致,即是说可以像调用函数一样来使用函数对象(#add类对象) ,如参数传递、返回值等。这种行为是通过重载类的()操作符来实现的,举例说明之,
其实我们早就开始使用函数对象了,当你写下sort(v.begin(), v.end())时(假定v是vector<int>),其实调用的是sort(v.begin(), v.end(), less<int>()),这样sort就会将v从小至大排序。若要逆向排序,你就需要显式地为sort指定一个排序规则,即函数对象 greater<int>(). less<T>和greater<T>是STL中的两个模板类,它们使用类型T的<和>操作符。 less<T>的一个典型实现可能是这样的:
函数对象的分类
根据用途和参数特征,STL中的函数对象通常分为以下几类:Predicates, Arithmetic Function Objects, Binders, Negaters, Member Function Adapters, Pointer to Function Adapters。下面逐一介绍一下,之前得先介绍两个基类:
使用这两个基类,首先需要包含头文件。
Predicates
Predicate是一种函数对象,返回值(应该是operator()的返回值)为布尔型,接受一个或者两个参数。通常用来判断对象的有效性(一个参数时)或者对两个对象进行比较(如less)。你可以根据自己的需要定义自己的Predicate,但STL已经定义了一些Predicate,你可以直接使用。
算术运算函数对象
进行简单的算术运算,这类函数对象我用的很少,通常是自己定义。
绑定Binders
有两种绑定bind1st和bind2nd,它们可以将一个二元函数对象的其中一个参数绑定为某个已知的对象,从而得到一个一元函数对象。例如要在vector<int> v中查找等于372的值的位置,我可以将372绑定到equal_to<int>()的第一个或者第二个参数:
其实,这里的bind1st和bind2nd并不是函数对象,只是模板函数而已。这两个函数分别返回类型为binder1st和binder2nd的函数对象。下面的代码,聪明的你肯定一看就懂:
Negaters
Negater是针对Predicate设计的,它简单的将Predicate的返回值取反。有两个Negater,not1和not2,分别对一元和二元Predicate取反。
Member Function Adapters
有时候,你可能想让算法调用容器元素的成员函数,而不是外部函数。因为外部无法改变对象内的状态,且内部函数通常 具有更高的效率 。例如swap(string, string)总是没有string.swap(string)快速。又比如sort无法对list进行排序,这时候只能使用list.sort()来给链表排序。这时候就需要使用一定的方法将对象内部的函数“变成”函数对象,这样的函数对象叫做成员函数适配器,其实前面的binder也是一种适配器。看下面的例子:
上面的例子中,遍历vector<list<int> >并对链表进行排序。其中使用的是成员函数适配器mem_fun_ref,它返回的函数对象会以list<int>对象的引用为参数。另外一个mem_fun则是以指向list<int>对象的指针为参数。
原帖地址
http://www.cnblogs.com/weiqubo/archive/2011/02/16/1956552.html
- [STL]函数对象/仿函数
- [STL]函数对象/仿函数
- stl 仿函数(函数对象)
- STL---函数对象(仿函数)概述
- 8 STL仿函数(函数对象)
- 仿函数(函数对象)和STL算法
- C++ STL 基础及应用(7) 函数对象(仿函数)
- STL源码剖析——仿函数(函数对象)
- STL仿函数
- 【STL】仿函数细节
- STL仿函数
- STL仿函数functor
- c++ STL仿函数
- stl--仿函数
- stl仿函数
- stl--仿函数
- c++ STL仿函数
- stl仿函数
- 何谓程序,何谓人生
- cdecl、stdcall、fastcall函数调用约定区别
- Mysql Blob
- Fragment动画效果
- Tomcat6.0配置C3P0连接池(Oracle)
- [STL]函数对象/仿函数
- HBase技术介绍
- 打造类似visual studio,eclipse功能强大的vim
- VIM快捷键
- Java垃圾回收机制与引用类型
- oracle判断某个字段的值是不是数字
- flex小结
- Windows 7 桌面上的 Internet Explorer 图标消失
- out与ref的区别