什么是仿函数
仿函数,顾名思义,就是“仿造函数”的意思,它并不是函数,但是却有着类似于函数的行为。那么,它到底是什么? 简单的说就是重载()
运行符号。
为什么要学这个呢?主要原因在于为下面学习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
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
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
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>
| 逻辑否 |