Skip to content

函数对象(仿函数)

函数对象的相关笔记

1. 定义

也叫仿函数。 如果一个类()运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象函数对象是一个对象,但是使用的形式看起来像函数调用,实际上也执行了函数调用,因而得名。

2. 举例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <iostream>
class CAverage
{
public:
    double operator()(int a1, int a2, int a3)
    {  //重载()运算符
        return (double)(a1 + a2 + a3) / 3;
    }
};

int main()
{
    CAverage average;  //能够求三个整数平均数的函数对象
    cout << average(3, 2, 3);  //等价于 cout << average.operator(3, 2, 3);
    return 0;
}

3. STL中的函数对象

在STL中定义了很多函数对象类模板

函数对象类模板 成员函数 T operator ( const T & x, const T & y) 的功能
plus \<T> return x + y;
minus \<T> return x - y;
multiplies \<T> return x * y;
divides \<T> return x / y;
modulus \<T> return x % y;
成员函数 bool operator( const T & x, const T & y) 的功能
equal_to \<T> return x y;
not_equal_to \<T> return x! = y;
greater \<T> return x > y;
less \<T> return x < y;
greater_equal \<T> return x > = y;
less_equal \<T> return x <= y;
logical_and \<T> return x && y;
logical_or \<T> return x | y;
成员函数 T operator( const T & x) 的功能
negate \<T> return - x;
成员函数 bool operator( const T & x) 的功能
logical_not \<T> return ! x;

例如,如果要求两个 double 型变量 x、y 的乘积,可以写: multiplies\ () (x, y) 其中multiplies\ ()是将函数对象类实例化,(x,y)是调用函数

less的实现

1
2
3
4
5
6
1. template <class_Tp>
2. struct less
3. {
4. bool operator() (const_Tp & __x, const_Tp & __y) const
5. { return __x < __y; }
6. };