STL源码剖析之仿函数
2015-11-01 21:47
239 查看
本文仅作为个人学习总结。
作为STL六大组件之一的仿函数,短小、灵活,为算法提供“策略”,使STL应用更加灵活和广泛。
仿函数(functor),顾名思义,类似函数,按照最新C++标准规范,其最新名称为函数对象。
我的理解就是,仿函数就是这样的对象,它和函数类似,可以call,即具有类似函数调用的行为。
那么如何做到这一点呢?即如何定义一个对象,可以像函数一样被调用?
其实了解c++语法的同学知道函数调用时用的()操作符是可以重载的,那么我们只要重载(),下面是一个很简单的例子。
这里的display就是一个仿函数,作为for_each()的第三个参数,提供策略,即对元素的操作。
我们可以定义一个仿函数对象,如
display<int> obj1;
那么obj1就是一个函数对象,可如下使用:
obj1(3)
看上去就像函数调用一样!
其实我们发现其实也可以用函数指针传递给算法作为参数。那么为啥还要定义一个仿函数呢?
简单的说,就是仿函数是一个class template,可以融入STL大家族,搭配其他的组件。
仔细一点发现,上面的例子中,display继承了一个类,unary_function,该类存在两个型别定义,这种技巧用来使得display具有可配接的能力。
参考资料:《STL源码剖析》侯捷
作为STL六大组件之一的仿函数,短小、灵活,为算法提供“策略”,使STL应用更加灵活和广泛。
仿函数(functor),顾名思义,类似函数,按照最新C++标准规范,其最新名称为函数对象。
我的理解就是,仿函数就是这样的对象,它和函数类似,可以call,即具有类似函数调用的行为。
那么如何做到这一点呢?即如何定义一个对象,可以像函数一样被调用?
其实了解c++语法的同学知道函数调用时用的()操作符是可以重载的,那么我们只要重载(),下面是一个很简单的例子。
#include <iostream> #include <algorithm> using namespace std; template <class T> struct display:public unary_function<T,void>{ void operator()(const T &x){ cout << x << endl; } }; /*void play(const int &x){ cout << x << endl; }*/ int main(){ int a[]={1,2,3,4,5}; for_each(a,a+5,display<int>()); system("pause"); return 0; }
这里的display就是一个仿函数,作为for_each()的第三个参数,提供策略,即对元素的操作。
我们可以定义一个仿函数对象,如
display<int> obj1;
那么obj1就是一个函数对象,可如下使用:
obj1(3)
看上去就像函数调用一样!
其实我们发现其实也可以用函数指针传递给算法作为参数。那么为啥还要定义一个仿函数呢?
简单的说,就是仿函数是一个class template,可以融入STL大家族,搭配其他的组件。
仔细一点发现,上面的例子中,display继承了一个类,unary_function,该类存在两个型别定义,这种技巧用来使得display具有可配接的能力。
参考资料:《STL源码剖析》侯捷
相关文章推荐
- [NOIP 2012]同余方程 扩展欧几里得
- 不在乎你用到了什么技术,而在于你提供了哪些有价值的东西
- Spinner、CheckBox、RadioGroup的简单使用
- 界面原型创建工具Axure 基本操作
- 插座变量,Interface Builder
- 期中总结
- 访问者模式
- 实验2正篇——内存管理
- 硬件之殇
- UVA 10622 Perfect P-th Powers (唯一分解定理 + GCD)
- [NOIP 2010]机器翻译 stl队列+multiset
- Sql server笔记
- HDU杭电3339 In Action 【Dijistra+0-1背包】
- hdu5536 Chip Factory (暴力+优化)
- 让文字功力从优秀走向精致——25位专业人士的写作心得
- 素数筛选法模板
- [NOIP 2010]关押罪犯 贪心+并查集
- 2015 iOS心得八 项目使用自定义的字体
- 【JAVA】MyEclipse-注册-破解
- OEM status|start|stop