天天看点

函数对象及适配器

 定义了调用操作符的类,其对象常称作函数对象(function object),即它们的行为表现出类似于函数的行为。      函数对象通常用作泛型算法的实参,如标准库中大量泛型算法有需要函数对象的版本。函数对象使用起来可以比函数灵活。标准库在头文件<functional>头文件中定义了一组算术、关系与逻辑函数对象类,还定义了一组函数适配器,使我们能够特化或者扩展标准库所定义的以及自定义的函数对象类。  

 算术函数对象类型  plus<Type>   +
 minus<Type>  -
 multiplies<Type>  *
 divides<Type>  /
 modulus<Type>  %
 negate<Type>  -
 关系函数对象类型  equal_to<Type>  ==
 not_equal_to<Type>  !=
 greater<Type>  >
 greater_equal<Type>  >=
 less<Type>  <
 less_equal<Type>  <=
 逻辑函数对象类型  logical_and<Type>  &&
 logical_or<Type>  ||
 logical_not<Type>  !

     每个标准库函数对象类表示一个操作符,即,每个类都定义了应用命名操作的调用操作符。上面只有两个一元函数对象(unary function-object):negate<Type>和<logical_not<Type>,其它都是二元函数对象(binary function-object)。      函数对象常用于覆盖算法中使用的默认操作符。在使用标准库的函数对象时,需要生成该模板类的一个实例对象,然后将生成的函数对象传递给算法。例如,sort默认使用operator<按升序对容器进行排序。为了按降序对容器进行排序,可以传递函数对象greater:    sort (svec.begin(), svec.end(), greater<string>()); 其中,greater<string>()表示生成一个比较元素类型为string类的greater函数对象。      标准库提供了一组函数适配器(function adapter),用于特化和扩展一元和二元函数对象。函数适配器分为如下两类:    1)绑定器(binder):它通过将一个操作数绑定到给定值而将二元函数对象转换为一元函数对象。    2)求反器(negator):它将谓词函数对象的真值求反。      标准库定义了两个绑定器适配器:bind1st和bind2nd。每个绑定器接受一个函数对象和一个值。bind1st将给定值绑定到二元函数对象的第一个实参,bind2nd将给定值绑定到二元函数对象的第二个实参。例如,为了计算一个容器中所有小于或等于10的元素的个数,可以这样给count_if传递值:    count_if (vec.begin(), vec.end(), bind2nd(less_equal<int>(), 10));      标准库还定义了两个求反器:not1和not2。not1将一元函数对象的真值求反,not2将二元函数对象的真值求反。例如:    count_if (vec.begin(), vec.end(), not1(bind2nd(less_equal<int>(), 10))); 其效果是对不<=10的那些元素计数,即对>10的元素计数。  

继续阅读