您的位置:首页 > 其它

STL源码剖析之仿函数

2015-11-01 21:47 239 查看
本文仅作为个人学习总结。

作为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源码剖析》侯捷
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: