Skip to content

什么是仿函数

仿函数,顾名思义,就是“仿造函数”的意思,它并不是函数,但是却有着类似于函数的行为。那么,它到底是什么? 简单的说就是重载()运行符号。

为什么要学这个呢?主要原因在于为下面学习STL做好准备,同时仿函数自己本身有如下的优点

  • 仿函数可有拥有自己的数据成员和成员变量,这意味着这意味着仿函数拥有状态。这在一般函数中是不可能的。
  • 仿函数通常比一般函数有更好的速度
c
#include <cstdio>
using namespace std; 

struct ADD{
    int num;
    ADD(int a){
        num = a;
    }
    int operator()(int x){
        return x+num;
    }
};
int main(){
    ADD add1(1);
    ADD add42(42);
    printf("%d\n",add42(100));
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

体现带有状态

c
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std; 

struct Bigger {
    int num;
    Bigger(int x):num(x){};
    bool operator()(int a){
        return a > num;
    }
};
int main(){
    vector<int> v{ 1, 2, 3, 4, 4, 3, 7, 8, 9, 10 };
    int ans = count_if(v.begin(), v.end(), Bigger(5));
    printf("%d\n",ans);
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

sort中使用仿函数

c
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std; 

int a[] = {-4,-8,2,-9,0};
int b[] = {-4,-8,2,-9,0};
int c[] = {-4,-8,2,-9,0};

struct small{
    bool operator()(int a,int b){
        return a < b;
    }
};
int main(){
    int i,len = sizeof(a)/sizeof(a[0]);
    sort(a,a+len,small());
    for(i=0;i<=len-1;++i){
        printf("%d ",a[i]);
    }
    printf("\n");

    sort(b,b+len,less<int> ());
    for(i=0;i<=len-1;++i){
        printf("%d ",b[i]);
    }
    printf("\n");

    sort(b,b+len,greater<int> ());
    for(i=0;i<=len-1;++i){
        printf("%d ",c[i]);
    }
    printf("\n");

    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

c++中自带的仿函数

1.算数类仿函数:

|-----------------|------| | plus<T> | 相加 | | minus<T> | 相减 | | multiplies<T> | 相乘 | | divides<T> | 相除 | | modulus<T> | 取模 | | negate<T> | 取否 |

2.关系运算类仿函数|

|--------------------|----------| | equal_to<T> | 等于 | | not_equal_to<T> | 不等于 | | greater<T> | 大于 | | greater_equal<T> | 大于等于 | | less<T> | 小于 | | less_equal<T> | 小于等于 |

3.逻辑运算仿函数|

|------------------|--------| | logical_and<T> | 逻辑与 | | logical_or<T> | 逻辑或 | | logical_no<T> | 逻辑否 |

其它使用仿函数的例子