仿函数(functors/function objects)原理及使用
2016-02-19 08:53
736 查看
仿函数(functors,或名 function objects,函数对象),是 STL 六大组件(Components)的重要一环,如下图:
在STL的历史上,仿函数(functors)是早期的命名,C++ 标准定案后使用函数对象(function objects)的叫法。就实现意义而言,“函数对象”:一种具有函数性质的对象(本质为对象)。不过,就其行为而言,以及就中文用词的清晰漂亮和独特性而言,“仿函数”一次较为鲜明。
仿函数的应用场景主要在:作为算法组件中的相关函数接口的参数。更具体地说,STL 所提供的各种算法,往往有两个版本,其中一个版本表现出最常用(或最直观)的某种运算,第二个版本则表现出最泛化的演算流程,允许用户“以 template 参数来指定所要采行的策略”。就拿
再举
STL 仿函数的分类,
若以操作数(operand)的个数划分,可分为一元(unary_function)和二元(binary_function)仿函数
若以功能划分,可分为算术运算(Arithmetic)、关系运算(Rational)、逻辑运算(Logical)三大类
中的表达式
在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=120 return 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源码剖析 第七章相关文章推荐
- 刨根问底Objective-C Runtime
- Objective-C总Runtime的那点事儿(一)消息机制
- Struts的ObjectFactory
- Objective-C 中Self 和 Super 详解
- 用EL表达式取List<Map<String, Object>>map的值(查阅了很久,总结一下)
- Objective-C内存管理
- React Native开发坑之null is not an object (evaluating 'inst.componentWillReceiveProps')
- 继承自NSObject的不常用又很有用的函数(2)
- 笔记:harvesting discriminative meta objects with deep CNN features for scene classification
- JavaScript 中的Object的使用详解笔记(一)
- 【书籍篇】《Objective-C程序设计》语法相关
- 三言两语 - 理解Objective-C的meta-class
- iOS中js与objective-c的交互
- iOS开发之Objective-C与JavaScript的交互
- ios经验收藏 使用objection来模块化开发iOS项目
- The Java™ Tutorials — Concurrency :Lock Objects 锁对象
- JSONObject与JSONArray的使用
- Objective-C runtime
- python flask api get时ValueError("No JSON object could be decoded")
- iOS Swift 和 Objective-c 两种语言对于多线程的详细解释