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源码剖析》侯捷

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值