仿函数(functors/function objects)原理及使用
仿函数(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()
系调用函数对象 fo
的 opeator()
,而非调用函数fo()
。
References
[1] STL源码剖析 第七章
仿函数(functors/function objects)原理及使用相关推荐
- 仿函数functors
一.仿函数 仿函数一个class里面重载小括号(),function core operator.仿函数创建的对象是函数对象,是一个对象,像一个函数,function object.仿函数只为算法服务 ...
- 深入ftrace function graph原理
学习完了ftrace的function的基本功能,其作用主要是用来跟踪特定内核函数调用的频次,对于内核,特别是初学者,对于函数的调用关系不清晰,并且内核中有很多函数指针,会把我们弄的摸不着头脑,那么我 ...
- c语言 谓词,C++ 谓词(predicate) 与 仿函数 ( functor (function object))
#谓词与函数对象 谓词 predicate C++ 标准定义谓词如下: The Predicate parameter is used whenever an algorithm expects a ...
- 可调用对象、std::function、std::bind
可调用对象.std::function.std::bind 仿函数functors function adapter bind(C++11) 函数适配器:bind2nd 仿函数适配器(mem_fun/ ...
- From C++ to Objective-C
Contents(目录) Table of contents (章节目录) Introduction (导言) 1 Objective-C and Cocoa 1.1 A short history ...
- 深入理解JavaScript内部原理(5): function
本文是翻译http://dmitrysoshnikov.com/ecmascript/chapter-5-functions/#introduction 概要 In this article we w ...
- c++仿函数调用方式
仿函数的主要功能是为了搭配STL算法使用,单独使用仿函数的情况比较少. 仿函数(functors)在C++标准中采用的名称是函数对象(function objects).仿函数主要用于STL中的算法中 ...
- C++11中std::function的使用
类模版std::function是一种通用.多态的函数封装.std::function的实例可以对任何可以调用的目标实体进行存储.复制.和调用操作,这些目标实体包括普通函数.Lambda表达式.函数指 ...
- JavaScript:Object.prototype.toString方法的原理
在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. var arr = []; console.log(Obje ...
最新文章
- ACMNO.2 输入一个华氏温度,要求输出摄氏温度。公式为 c=5(F-32)/9 输出要求有文字说明,取位2小数。 输入 一个华氏温度,浮点数 输出 摄氏温度,浮点两位小数
- paip. 提升性能---hibernate的缓存使用 总结
- Python程序开发——第二章 条件语句和循环语句
- 数据库:MySQL中,当update修改数据与原数据相同时会再次执行吗?
- C# 基于事件的异步模式
- php fpm 调试模式,调试 – nginx php-fpm xdebug netbeans只能启动一个调试会话
- 前端学习(2447):数据筛选处理
- 判断mac地址单播还是组播(shell脚本)
- HTMLTestRunner测试报告
- C++ 基于 Visual C++6.0 的 DLL 编程实现
- 手环升级鸿蒙设备名单,定档6月2日!鸿蒙“首批”升级名单公布,共计11款华为机型!...
- linux scp 隐藏文件,scp 客户端发现了隐藏 35 年的漏洞
- 电力设备管理杂志电力设备管理杂志社电力设备管理编辑部2022年第14期目录
- Unity3D 使用UGUI实现公告牌
- Nginx+Tomcat负载均衡--win7配置详解
- 记录一次idea启动失败问题Improperly specified VM option. To fix the problem, edit your JVM options and remove t
- Talk预告 | 普渡大学王虓:如何利用合作对抗学习来提升自监督学习
- 树莓派开发和车牌识别
- 蓝桥杯培训试题新解——计算两个日期之间的天数间隔
- 关于vim gf问题
热门文章
- Tensorflow——Variable变量(打印数字小实例)
- 网络传输大数据——内存映射
- C语言新手写扫雷攻略1
- Flink1.6系列之—数据流编程模型
- 使用HslCommunication实现PLC数据的远程客户端监视,以及web端实时监视,远程操作设备示例...
- Spring数据转换(二)-- @InitBinder
- 鼠标移开事件(onmouseout)
- Linux(CentOS7.1)修改默认yum源为国内的阿里云yum源
- Linux与windows的软/硬链接
- eclipse中常见快捷键