码迷,mamicode.com
首页 > 其他好文 > 详细

函数对象

时间:2016-10-22 00:15:43      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:排序   删除   构造函数   运算   nbsp   对象   指针   自适应   rem   

     函数对象也叫函数符,包括函数名、指向函数的指针和重载了()运算符的类对象。重载的()运算符将使得能够像函数那样使用类对象。如for_each()的第三个参数可以使常规函数,也可以是函数符,它将指定的函数用于区间中的每个成员。

     生成器是不用参数就可以调用的函数符,一元函数是用一个参数可以调用的函数符,而返回bool值的一元函数就是谓词。返回bool类型的二元函数叫二元谓词,如sort()第三个参数就需要二元谓词,前两个参数是要STL容器要排序的迭代器。在list模板中有一个remove_if()成员也是将谓词作为参数,它应用于区间的每个元素,如果谓词返回true,就删除这些元素。谓词只能有一个参数,如果想再传递一个参数,可以使用类成员而不是函数参数传递,注意这时相当于把类对象作为函数符,其内部要重载()运算符。附加的参数可通过构造函数传递。

    transform()有两个版本,第一个版本接受4个参数,前两个参数指定容器区间的迭代器,第三个参数指定将结果复制到哪里的迭代器,最后一个参数是谓词。第二种版本最后一个参数可使用二元谓词,返回两个区间的二元算术运算(如mean,add等)。

    C++还预定了自适应函数符和函数适配器。使函数符成为自适应的原因是,它携带了标示参数类型和返回类型的typedef成员。其意义在于函数适配器可以使用函数对象,并认为存在这些typedef成员。STL使用binder1st和binder2nd可以将自适应二元函数转换为自适应一元函数。如:

    binder1st(f2,val) f1;

     该对象f1与一个将被用作f2()的第一个参数的特定值val相关联。这样f1(x)等价于f2(val,x)。如果要将二元函数multiplies()转换为将参数乘以2.5的一元函数,可用如下方式:

    bind1st(multiplies<double>(),2.5);

函数对象

标签:排序   删除   构造函数   运算   nbsp   对象   指针   自适应   rem   

原文地址:http://www.cnblogs.com/bluecloudwyy/p/5986426.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!