函数对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数对象相关的知识,希望对你有一定的参考价值。
函数对象也叫函数符,包括函数名、指向函数的指针和重载了()运算符的类对象。重载的()运算符将使得能够像函数那样使用类对象。如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);
以上是关于函数对象的主要内容,如果未能解决你的问题,请参考以下文章
R语言常用基础函数:length函数查看数据对象的长度str函数查看数据对象的结构class函数查看数据对象的类型names函数查看数据对象的名称