--介绍
函数和类似函数的对象(仿函数)遍布STL。关联容器使用它们来使元素保持有序;find_if这样的算法使用它们来控制它们的行为;
如果缺少它们,那么比如for_each和transform这样的组件就没有意义了;比如not1和bind2nd这样的适配器会积极地产生它们。
--定义
仿函数(functor)就是一个重载了"()"运算符的struct或class(基本上使用struct),利用对象支持operator()的特性,来达到模拟函数调用效果的技术。
仿函数的相应型别主要用来表现函数参数型别和传回值型别。为了方便起见,<functional>定义了两个基类,分别代表一元仿函数(unary_function)和二元
仿函数(binary_function)(STL不支持三元仿函数)当然我们也可以不继承这两个基类,只要实现"()"运算符重载即可
--详解
STL函数对象在函数指针之后成型,所以STL中的习惯是当传给函数和从函数返回时函数对象也是值传递的(也就是拷贝),
函数对象的值拷贝暗含以下两个要求:
第一,你的函数对象应该很小。否则它们的拷贝会很昂贵。
第二,你的函数对象必须单态(也就是,非多态,纯函数)——它们不能用虚函数。那是因为派生类对象以值传递代入基类类型的参数会造成切割问题,在拷贝时,它们的派生部分被删除。
纯函数的定义
纯函数是返回值只依赖于参数的函数。如果f是一个纯函数,x和y是对象,f(x, y)的返回值仅当x或y的 值改变的时候才会改变。
在C++中,由纯函数引用的所有数据不是作为参数传进的就是在函数生存期内是常量。(一般,这样的常量应该声明为const。)
//非纯函数例子
int func1(int x)
{
/*
这并非一个纯函数,因为有a这个静态变量,每一次调用func1,a的值都会发生变化
即使每次x是相同的,但是返回值是不同的
*/
static int a = ;
a++;
return x + a;
}

最新文章

  1. jquery插件图片延时加载实例详解
  2. Yii2.0 用户登录详解(上)
  3. PHP无限极分类
  4. Shell脚本编程中的几个问题
  5. 汇编学习(三)&mdash;&mdash;汇编语言程序入门
  6. SpringBoot使用velocity模板引擎
  7. java线程控制、状态同步、volatile、Thread.interupt以及ConcurrentLinkedQueue
  8. Extend ComboGrid Editors for DataGrid Of JQuery EasyUI
  9. 网络流(最大密集度子图,分数规划):UvaLive 3709 Hard Life
  10. 【Cocos2d-X开发学习笔记】第29期:游戏中数据的存储(上)
  11. Unknown system variable &#39;tx_read_only&#39;
  12. POJ 2409 Let it Bead 组合数学
  13. mysql外键设置选项
  14. spring MVC上传附件
  15. java的设计模式 - 单例模式
  16. C#对象与XMl文件之间的相互转换(转)
  17. mybatis整合springboot 以及需要注意的细节
  18. verilog-testbench 时钟和复位模板
  19. sock5协议转换http协议工具polipo使用笔记(Centos7)
  20. 来不及说什么了,Python 运维开发剁手价仅剩最后 2 天

热门文章

  1. 分布式系统的那些事儿(四) - MQ时代的通信
  2. FFmpeg(14)-使用NDK、C++完成EGL,display, surface, context的配置和初始化
  3. MATLAB学习之内存溢出的管理方法
  4. 【工具】我的Eclipse使用习惯
  5. 【电子基础】IIC总线工作原理
  6. Spark中的IsNotNull函数怎么用
  7. std::bind()图解
  8. 【深度学习】理解dropout
  9. 【Turing Award】Robin Milner And Butler W. Lampson
  10. linespace函数