Functor仿函数
2015-12-29 11:29
363 查看
转载声明:本文转自网络,稍加整理以备学习和參考之用。
函数对象/仿函数
提到C++ STL。首先被人想到的是它的三大组件:Containers, Iterators, Algorithms,即容器,迭代器和算法。容器为用户提供了经常使用的数据结构,算法大多是独立于容器的经常使用的基本算法,迭代器是由容器提供的一种接口。算法通过迭代器来操控容器。接下来要介绍的是另外的一种组件。函数对象(FunctionObject,JJHou译作Functor仿函数)。
什么是函数对象
顾名思义,函数对象首先是一个对象,即某个类的实例。其次,函数对象的行为和函数一致,即是说能够像调用函数一样来使用函数对象,如參数传递、返回值等。
这样的行为是通过重载类的()操作符来实现的,
仿函数:用途和适用的场合
之所以要开发仿函数(functors),是由于函数不能容纳不论什么有意义的状态。
比如。使用函数,你不能为某个元素加一个随意值。再将其应用于一个范围。可是,使用仿函数可轻易做到这一点。
举个栗子。。。
e
l
l
o
===========GAP===============
w
o
r
l
d
可能会有疑问两者有什么差别?
假如我要for_each遍历的不是字符串而是int类型的vector呢?
是不是又要重写一个int类型作为參数的回调函数,那假设有N种类型的容器遍历岂不是要写N个回调函数或N个仿函数类?
非也!!!
C++有类模板 也有 函数模板 相同能够用于回调
?
2
3
4
5
===========GAP===============
Functor()
1/1
2/3
3/6
4/10
5/15
~Functor()
~Functor()
~Functor()
三次析构的原因:
先附上for_each的源代码(VC2008)
?
?
Functor()0032F800 //main函数中的实參仿函数对象
Copy Functor()0032F68C //值传递 对【实參对象】拷贝构造了形參对象
1/1
2/3
3/6
4/10
5/15
Copy Functor()0032F7E8 //返回对象的值类型 对【形參对象】拷贝构造
~Functor()0032F68C //析构形參对象
15
~Functor()0032F7E8 //析构返回值对象
~Functor()0032F800 //析构实參对象
如今一目了然了吧!
使用回调函数高效 由上面的样例能够看出 构造1次 拷贝构造2次 析构3次 是有代价的
最后回到仿函数和回调函数
差别在于:
使用仿函数能够声明在业务相关的类内部 缩小作用域
使用仿函数能够使用类的成员属性和成员函数
仿函数是一个类 能够使用面向对象的各种机制(封装
继承 多态)
若使用回调函数 那么仅仅能声明为某个类的静态成员函数或全局函数。使用类内部的资源须要用一些手段传參,没有直接使用成员函数便捷
相关文章推荐
- Sheepdog HTTP API
- itunes connect上传截图提示无法载入文件问题
- SVN返回版本
- 减少域名DNS解析时间将网页加载速度提升新层次-DNS缓存/预读取/拆分域名
- IzPack 学习教程 第一篇
- radiobutton的文本方位及与图片间距设置
- 【bzoj3697】【坑】采药人的路径 点分治
- PostgreSQL学习手册(函数和操作符<一>)
- windows 下 qt 连接 mysql 数据库
- request.getParameterMap()获得Map中的数据
- MySQL Notes
- String.xml 中%1$s %1$d 的使用方法
- 在lua中如何remove掉table里面的数据
- win7 旗舰版下如何分离磁盘空间与合并磁盘空间
- 关于sql的执行顺序
- vs2010 'yasm' is not recognized as an internal or external command
- 任务1
- java 实现 http 文件下载
- 圆形的imagview和正在加载的dialog
- JavaScript学习笔记(一)——JS基础知识介绍