首页 理论教育 大道至简:C++STL标准模板库适配器

大道至简:C++STL标准模板库适配器

时间:2023-10-25 理论教育 版权反馈
【摘要】:该成员函数代表辅助函数,用于产生一个binder1st对象。仿函数pointer_to_binary_function也是一种仿函数适配器,允许将函数指针Result视为一个自适应二元函数。例13-28例13-28的执行结果为:3.仿函数unary_negate和binary_negate无论是not1()还是not2(),其返回结果均为取“非”运算。仿函数unary_negate是自适应谓词,用于表示其他自适应谓词的逻辑负值。

大道至简:C++STL标准模板库适配器

小节主要讲述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>。该仿函数的基类是

978-7-111-51399-5-Chapter13-93.jpg

仿函数binder1st的声明形式为:

978-7-111-51399-5-Chapter13-94.jpg

978-7-111-51399-5-Chapter13-95.jpg

仿函数类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>。

该仿函数的基类是

978-7-111-51399-5-Chapter13-96.jpg

仿函数binder2nd的声明形式为:

978-7-111-51399-5-Chapter13-97.jpg

类binder2nd和类binder1st()相似,也包含5个成员函数。

由以上内容可知,这两个函数的区别在于:函数的第二个参数是不同的。而函数bind-er1st的第二个参数是“_Left”;而函数binder2nd的第二个参数是“_Right”。

在处理谓词时,这两个函数也非常有意义——可以将二元谓词转变成一元谓词,故常用于某范围内的数值与特定值之间的比较。

例13-26

978-7-111-51399-5-Chapter13-98.jpg

例13-26的执行结果为:

978-7-111-51399-5-Chapter13-99.jpg

978-7-111-51399-5-Chapter13-100.jpg

例13-27

978-7-111-51399-5-Chapter13-101.jpg

例13-27的执行结果为:

978-7-111-51399-5-Chapter13-102.jpg

上述例题中,两个仿函数的作用是不同的。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的声明形式如下:

978-7-111-51399-5-Chapter13-103.jpg

仿函数pointer_to_unary_function是一种仿函数适配器,允许将函数指针result(∗f)(Arg)视为一个自适应一元函数。值得说明的是,表示某函数的函数指针应该是一个相当不错的一元仿函数,可以传入任何的STL算法中。多数情况下,不会直接使用仿函数的构造器,而是使用其辅助ptr_fun()函数。例如,(www.xing528.com)

978-7-111-51399-5-Chapter13-104.jpg

上述语句可以将[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)。例如,

978-7-111-51399-5-Chapter13-105.jpg

对于仿函数pointer_to_binary_function,最常使用的也是其辅助函数ptr_fun()。

例13-28

978-7-111-51399-5-Chapter13-106.jpg

例13-28的执行结果为:

978-7-111-51399-5-Chapter13-107.jpg

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

978-7-111-51399-5-Chapter13-108.jpg

978-7-111-51399-5-Chapter13-109.jpg

例13-29的执行结果为:

978-7-111-51399-5-Chapter13-110.jpg

例13-30

978-7-111-51399-5-Chapter13-111.jpg

978-7-111-51399-5-Chapter13-112.jpg

例13-30的执行结果为:

978-7-111-51399-5-Chapter13-113.jpg

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

978-7-111-51399-5-Chapter13-114.jpg

978-7-111-51399-5-Chapter13-115.jpg

978-7-111-51399-5-Chapter13-116.jpg

例13-31的执行结果为:

978-7-111-51399-5-Chapter13-117.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈