本文仅供个人记录和复习,不用于其他用途
函数对象与谓词
函数对象是用作函数的对象,不过一般只是实现了operator()
的类的对象。虽然函数和函数指针也可以归为函数对象,但实现了operator()
的类的对象才能保存类成员属性的值,可以被用于STL算法。
一般来讲,函数对象分为下面两种类型:
- 一元函数
- 二元函数
其实接收几个参数就是几元函数,如果返回布尔值,则该函数被称为谓词。
一元函数
代码实例
|
|
上面这个函数可以用operator()
的形式表现出来:
|
|
那么这种形式可以直接当做函数来使用。例如:
|
|
for_each
接受3个参数:第一个参数指定范围起点,第二个参数指定范围的终点,第三个参数是要对指定范围内的每个元素调用的函数。也就是说,这些代码对于vecIntegers
中的每个元素调用DisplayElement::operator()
。当然,这里使用FuncDisplayElement
是一样的。
Lambda表达式
当然,我们也可以不定义,使用Lambda表达式(匿名函数对象)。
|
|
Lambda表达式可以很方便地使用函数对象,而不是要像上面那样定义一个函数或者结构。具体的可以查看Lambda表达式一章。
使用结构对象的优势
最大的好处就是能够存储信息,我们可以在结构中定义相应的成员属性,能够比单纯的函数方便许多。
一元谓词
返回布尔值的一元函数就是谓词,可以供STL算法进行判断。
|
|
这里有一个构造函数,存储传入的对象,然后把这个值和将要比较的值进行求余,判断是否能够被整除。如果结果为0,就证明能够被整除。
|
|
比如find_if
就能够让vecIntegers
中的所有元素和Divisor
整除,如果operator()
返回为true
,也就是元素可以被整除时,find_if
返回一个指向该元素的迭代器。
二元函数
二元函数一般针对于加减乘除,下面是一个示例:
|
|
我们可以在transform
中来使用二元函数:
|
|
transform
将vecMultiplicand
和vecMultiplier
内容相乘,并且储存在vecResult
中。
二元谓词
接受两个参数并返回一个布尔值的函数是二元谓词,这里也不再举例。