本小节主要讲述8种适配器:binder1st、binder2rnd、pointer_to_unary_function、unary_ne-gate、pointer_to_binary_function、binary_negate、unary_compose和binary_compose。以上8种适配器可以被分成4组:binder1st和binder2nd、pointer_to_unary_function和pointer_to_binary_function、unary_negate和binary_negate、unary_compose和binary_compose。
1.仿函数binder1st和binder2nd
仿binder1st()函数是一种仿函数适配器,可用于将自适应二元函数转换成自适应一元函数。若f是仿函数binder1st<BinaryFun>的对象,则f(x)返回F(c,x),其中F是Bi- naryFun对象,c是常量。F和c都被当成参数传递给binder1st()的构造函数。
通常使用仿binder1st()函数,不是使用其构造函数,而是使用其辅助binder1st()函数。通过将双参函数的第一个参数设置成某个常量,形成单参函数。
使用仿函数binder1st时,需要包含头文件<functional>。该仿函数的基类是
仿函数binder1st的声明形式为:
仿函数类binder1st具有5个成员函数:
1)argument_type。该成员函数代表参数型别BinaryFun::second_argument_type。
2)result_type。该成员函数代表参数型别BinaryFun::result_type。
3)result_type operator()(const argument_type& x)const。该成员函数代表函数调用的操作符。其返回值为F(c,x),其中F和C是binder1st对象构造时的参数。
4)binder1st(const BinaryFun& F,typename BinaryFun::first_argument_type c)。该成员函数代表辅助函数,用于产生一个binder1st对象。若F的型别是BinaryFun,则binder1st(F,c)不但等价于binder1st<BinaryFun>(F,c),并且更方便。型别T必须转换为Bina-ryFun的第一参数型别。
同样,仿binder2nd()函数也是一种仿函数适配器,可用于将自适应二元函数转换成自适应一元函数。若f是仿函数类binder2nd<BinaryFun>的对象,则f(x)会返回F(x,c),其中F为BinaryFun对象,c是常量。F和c均被作为参数传给binder2nd的构造器。直观上来讲,通过将双参函数的第二参数设定为常量,形成单参函数。
使用仿函数binder2nd时,也需要包含头文件<functional>。
该仿函数的基类是
仿函数binder2nd的声明形式为:
类binder2nd和类binder1st()相似,也包含5个成员函数。
由以上内容可知,这两个函数的区别在于:函数的第二个参数是不同的。而函数bind-er1st的第二个参数是“_Left”;而函数binder2nd的第二个参数是“_Right”。
在处理谓词时,这两个函数也非常有意义——可以将二元谓词转变成一元谓词,故常用于某范围内的数值与特定值之间的比较。
例13-26
例13-26的执行结果为:
例13-27
例13-27的执行结果为:
上述例题中,两个仿函数的作用是不同的。bind1st用于统计小于8的数值的个数(q<8);而bind2nd用于统计大于8的数值个数。
通俗地讲,对于某范围内的每个元素用字符q表,存在比较表达式a>b,程序中给定的值为val,如果使用函数bind1st,内部表达式是val>q;如果使用函数bind2nd,内部表达式是q>val。
2.仿函数pointer_to_unary_function和仿函数pointer_to_binary_function
仿函数pointer_to_unary_function的声明形式如下:
仿函数pointer_to_unary_function是一种仿函数适配器,允许将函数指针result(∗f)(Arg)视为一个自适应一元函数。值得说明的是,表示某函数的函数指针应该是一个相当不错的一元仿函数,可以传入任何的STL算法中。多数情况下,不会直接使用仿函数的构造器,而是使用其辅助ptr_fun()函数。例如,(www.xing528.com)
上述语句可以将[first,last]中的元素求取绝对值,并使用该绝对值序列将原序列取代。
仿函数pointer_to_binary_function也是一种仿函数适配器,允许将函数指针Result(∗f)(Arg1,Arg2)视为一个自适应二元函数。若F是一个仿函数pointer_to_binary_function<Arg1,Arg2,result>对象,以型别Result(∗)(Arg1,Arg2)的函数指针f作为初值,则F(x,y)会调用函数f(x,y)。例如,
对于仿函数pointer_to_binary_function,最常使用的也是其辅助函数ptr_fun()。
例13-28
例13-28的执行结果为:
3.仿函数unary_negate和binary_negate
无论是not1()还是not2(),其返回结果均为取“非”运算。
仿函数unary_negate是自适应谓词,用于表示其他自适应谓词的逻辑负值。若f是一个该仿函数的对象,构造时以pred作为其底部的仿函数,则f(x)会返回!pred(x)。通常使用辅助函数not1()实现该仿函数的功能,例not1(pred)。使用该辅助函数时,需要包含头文件<functional>。
仿函数binary_negate也是自适应谓词,用于表示其他自适应二元谓词的逻辑负值。若f是二元负<Predicate>对象,构造时以pred作为其底层的仿函数,则f(x,y)会返回!pred(x,y)。此仿函数的辅助函数是not2()。使用该辅助函数时,同样需要包含头文件<functional>。
提示
not1()可实现对单个参数表达式逻辑值的取反;not2()可实现对两个参数表达式逻辑值的取反。
例13-29
例13-29的执行结果为:
例13-30
例13-30的执行结果为:
4.仿函数unary_compose和binary_compose
在13.3节中讲述辅助用仿函数时,表13-2中列出了两个辅助用compose1()和compose2()函数。此处,再略加介绍。
仿函数unsry_compose的基类是:unary_compose<Fun1,Fun2>
仿函数类unary_compose是一种仿函数适配器。若f和g均是自适应一元函数,并且g的返回型别可转换为f的参数型别,则unary_compose可用于产生一个仿函数对象h,从而h(x)=f(g(x))(此种行为称为函数合成。函数合成是代数学的重要概念,即可以使用单纯的仿函数任意构造出复杂的仿函数)。该仿函数的辅助函数是compose1()。
仿函数binary_compose也是一种仿函数适配器。若f是自适应二元函数,g1()和g2()均为自适应一元函数,并且g1()和g2()的返回型别均可转换为f()的参数型别,仿函数binary_compose可用于产生一个仿函数h,并且h(x)=f(g1(x),g2(x))。该仿函数的辅助函数是compose2()。
使用上述两个仿函数时,需要包含头文件<functional>。
例13-31
例13-31的执行结果为:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。