暑假C++温习15之函数对象

暑假C++复习15之函数对象

标准库定义的函数对象

标准库定义了一组算术,关系与逻辑函数对象类,标准库还定义了一组函数适配器,使我们能够特化或者扩展标准库所定义的以及自定义的函数对象类,这些标准库函数对象类型是在functional头文件中定义的。

算术函数对象类型:

Plus<Type>        +

Minus<Type>      -

Multiplies<Type>   *

Divides<Type>     /

Modulus<Type>    %

Negate<Type>     -//负号

 

关系函数对象类型:

Equal_to<Type>     ==

Not_equal_to<Type> !=

Greater<Type>      >

Greater_equal      >=

Less<Type>        <

Less_equal         <=

 

逻辑函数对象类型:

Logical_add<Type>  &&

Logical_or<Type>    |

Logical_not<Type>   !

 

每个函数对象类都是一个模板,我们需要为该模板提供一种类型,例如:

Plus<string>是将string加法操作符应用于string对象。而plus<int>是将int操作符应用到int对象。

Plus<int> intAdd;

Negate<int>intNegate;

Int sum=intAdd(10,20);//sum=30

Sum=intAdd(10,intNegate(10));//sum=0;

 

在算法中使用标准库函数对象:

Sort(svec.begin().svec.end(),greater<string>());

将按降序对vecrtor进行排序。

 

函数对象的函数适配器

(1)      绑定器(binder),是一种函数适配器,它将通过一个操作数绑定到给定值而将二元函数对象转换为一元函数对象。

(2)      求反器(negator),是一种适配器。他将谓词函数对象的真值求反。

标准库定义了两个绑定器适配器:bind1st,bind2lnd,每个绑定器接受一个函数对象和一个值,正如你可能想到的,bind1st将给定的值绑定到二元函数对象的第一个实参,bind2nd将给定值绑定到二院函数对象的第二个实参。例如:

Count_if( vec.begin(), vec.end(), bind2nd( less_equal<int>(),10 ) );//小于等于10

传给count_if的第三个实参使用bind2nd函数适配器,该适配器返回一个函数对象,该对象用10作右操作数应用<=操作符。这个调用计算输入范围中小于或等于10的元素的个数。

 

标准库还定义了两个求反器:not1和not2你可能已经想到了,not1将一元函数对形象的真值求反,not2将二元函数队形的真值求反。

Count_if( vec.begin(), vec.end(), not2(bind2nd(less_equal<int>(), 10 )) );//结果不小于等于10