【STL】仿函数细节

一、概观

1、在STL历史上有两个不同的名称,仿函数是早期的命名,C++标准规格定案后采用的新名称是函数对象。

2、要将某种操作当作算法的参数,唯一办法是先将该操作设计为一个函数,再将函数指针当作算法的一个参数,或是将该操作设计

为一个所谓的仿函数(就语言层面而言是个class),再以该仿函数产生一个对象,并以此对象作为算法的一个参数。

3、既然函数指针可以达到“将整组操作当作算法的参数”,又何必需要所谓的仿函数呢?

因为函数指针毕竟不能满足STL对抽象性的要求,也不能满足软件积木的要求,函数指针无法和STL其他组件搭配。

4、仿函数为了能够“行为类似函数”,其类别定义中必须自定义function call运算子 operator()。

5、仿函数若以操作数的个数来分,可分为一元和二元仿函数,若以功能来分,可分为算术运算、关系运算、逻辑运算三类。

 

 

二、可配接的关键

1、每个仿函数都必须定义自己的相应型别。

2、仿函数的相应型别主要用来表现函数参数型别和传回值型别。

3、unary_function用来呈现一元函数的参数型别和传回值型别,定义如下:

template <class Arg, class Result> struct unary_function { typedef Arg argument_type; typedef Result result_type; };

4、binary_function用来表现二元的

template <class Arg1, class Arg2, class Result> struct binary_function { typedef Arg1 first_argument_type; typedef Arg2 second_argument_type; typedef Result result_type; };

 

三、STL中内置的一些仿函数

包含算术类、关系类、逻辑类等。

 

四、C++可重载的运算符

 

1、几乎所有的运算符都可用作重载。具体包含:

算术运算符:+,-,*,/,%,++,--;

   位操作运算符:&,|,~,^,<<,>>
   逻辑运算符:!,&&,||;
   比较运算符:<,>,>=,<=,==,!=;
   赋值运算符:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=;
   其他运算符:[],(),->,,(逗号运算符),new,delete,new[],delete[],->*。

  2、下列运算符不允许重载:

.,.*,::,?:

 

五、总结

仿函数在STL中是最小的一块,但作用非常大。要好好去理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值