仿函数(functors,或名 function objects,函数对象),是 STL 六大组件(Components)的重要一环,如下图:

在STL的历史上,仿函数(functors)是早期的命名,C++ 标准定案后使用函数对象(function objects)的叫法。就实现意义而言, “函数对象”:一种具有函数性质的对象(本质为对象)。不过,就其行为而言,以及就中文用词的清晰漂亮和独特性而言,“仿函数”一次较为鲜明。

仿函数的应用场景主要在:作为算法组件中的相关函数接口的参数。更具体地说,STL 所提供的各种算法,往往有两个版本,其中一个版本表现出最常用(或最直观)的某种运算第二个版本则表现出最泛化的演算流程,允许用户“以 template 参数来指定所要采行的策略”。就拿accumulate()(<numeric>头文件)来说,其一般行为(第一个版本)是将指定范围内的所有元素相加,第二个版本则允许你指定某种“操作”(甚至是相乘),取代第一个版本中的“相加”行为。

template<typename T>
struct multiplier :public std::binary_function<T, T, T>
{T operator() (const T& left, const T& right) const{return left*right;}
}int main(int, char**)
{std::vector<int> v = {1, 2, 3, 4, 5};std::cout << std::accumulate(v.begin(), v.end(), 1, multiplier<int>()) << std::endl;// 1*1*2*3*4*5=120return 0;
}

再举sort()为例,其第一版本是以operator<为排序时的元素位置调整依据,第二个版本则允许用户指定任何“操作”,务求排序后的两两相邻元素都能令该操作结果为 true

STL 仿函数的分类,

  • 若以操作数(operand)的个数划分,可分为一元(unary_function)和二元(binary_function)仿函数

  • 若以功能划分,可分为算术运算(Arithmetic)、关系运算(Rational)、逻辑运算(Logical)三大类

函数对象(function objects)的概念

所谓 function object (或者说 functor),是一个定义了 operator()的对象,

FunctionObjectType fo;
...
fo();

中的表达式fo()系调用函数对象 foopeator(),而非调用函数fo()

References

[1] STL源码剖析 第七章

仿函数(functors/function objects)原理及使用相关推荐

  1. 仿函数functors

    一.仿函数 仿函数一个class里面重载小括号(),function core operator.仿函数创建的对象是函数对象,是一个对象,像一个函数,function object.仿函数只为算法服务 ...

  2. 深入ftrace function graph原理

    学习完了ftrace的function的基本功能,其作用主要是用来跟踪特定内核函数调用的频次,对于内核,特别是初学者,对于函数的调用关系不清晰,并且内核中有很多函数指针,会把我们弄的摸不着头脑,那么我 ...

  3. c语言 谓词,C++ 谓词(predicate) 与 仿函数 ( functor (function object))

    #谓词与函数对象 谓词 predicate C++ 标准定义谓词如下: The Predicate parameter is used whenever an algorithm expects a ...

  4. 可调用对象、std::function、std::bind

    可调用对象.std::function.std::bind 仿函数functors function adapter bind(C++11) 函数适配器:bind2nd 仿函数适配器(mem_fun/ ...

  5. From C++ to Objective-C

    Contents(目录) Table of contents (章节目录) Introduction (导言) 1 Objective-C and Cocoa  1.1 A short history ...

  6. 深入理解JavaScript内部原理(5): function

    本文是翻译http://dmitrysoshnikov.com/ecmascript/chapter-5-functions/#introduction 概要 In this article we w ...

  7. c++仿函数调用方式

    仿函数的主要功能是为了搭配STL算法使用,单独使用仿函数的情况比较少. 仿函数(functors)在C++标准中采用的名称是函数对象(function objects).仿函数主要用于STL中的算法中 ...

  8. C++11中std::function的使用

    类模版std::function是一种通用.多态的函数封装.std::function的实例可以对任何可以调用的目标实体进行存储.复制.和调用操作,这些目标实体包括普通函数.Lambda表达式.函数指 ...

  9. JavaScript:Object.prototype.toString方法的原理

    在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. var arr = []; console.log(Obje ...

最新文章

  1. ACMNO.2 输入一个华氏温度,要求输出摄氏温度。公式为 c=5(F-32)/9 输出要求有文字说明,取位2小数。 输入 一个华氏温度,浮点数 输出 摄氏温度,浮点两位小数
  2. paip. 提升性能---hibernate的缓存使用 总结
  3. Python程序开发——第二章 条件语句和循环语句
  4. 数据库:MySQL中,当update修改数据与原数据相同时会再次执行吗?
  5. C# 基于事件的异步模式
  6. php fpm 调试模式,调试 – nginx php-fpm xdebug netbeans只能启动一个调试会话
  7. 前端学习(2447):数据筛选处理
  8. 判断mac地址单播还是组播(shell脚本)
  9. HTMLTestRunner测试报告
  10. C++ 基于 Visual C++6.0 的 DLL 编程实现
  11. 手环升级鸿蒙设备名单,定档6月2日!鸿蒙“首批”升级名单公布,共计11款华为机型!...
  12. linux scp 隐藏文件,scp 客户端发现了隐藏 35 年的漏洞
  13. 电力设备管理杂志电力设备管理杂志社电力设备管理编辑部2022年第14期目录
  14. Unity3D 使用UGUI实现公告牌
  15. Nginx+Tomcat负载均衡--win7配置详解
  16. 记录一次idea启动失败问题Improperly specified VM option. To fix the problem, edit your JVM options and remove t
  17. Talk预告 | 普渡大学王虓:如何利用合作对抗学习来提升自监督学习
  18. 树莓派开发和车牌识别
  19. 蓝桥杯培训试题新解——计算两个日期之间的天数间隔
  20. 关于vim gf问题

热门文章

  1. Tensorflow——Variable变量(打印数字小实例)
  2. 网络传输大数据——内存映射
  3. C语言新手写扫雷攻略1
  4. Flink1.6系列之—数据流编程模型
  5. 使用HslCommunication实现PLC数据的远程客户端监视,以及web端实时监视,远程操作设备示例...
  6. Spring数据转换(二)-- @InitBinder
  7. 鼠标移开事件(onmouseout)
  8. Linux(CentOS7.1)修改默认yum源为国内的阿里云yum源
  9. Linux与windows的软/硬链接
  10. eclipse中常见快捷键