# 🎲 STL 函数对象/仿函数
# 函数对象
📋 概念:
- 重载函数调用操作符的类,其对象常称为函数对象
- 函数对象使用重载的
()
时,行为类似函数调用,也叫仿函数
- 本质:函数对象(仿函数)是一个类,不是一个函数
- 特点:
- 函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值
- 函数对象超出普通函数的概念,函数对象可以有自己的状态
- 函数对象可以作为参数传递
# 谓词
📋 概念: 返回 bool
类型的仿函数称为谓词
- 如果
operator()
接受一个参数,那么叫做一元谓词 - 如果
operator()
接受两个参数,那么叫做二元谓词
➰ 示例1:一元谓词
#include <iostream>
#include <algorithm> // find_if()
#include <vector>
using namespace std;
class GreaterFive {
public:
// 重载()操作符
bool operator() (int val){ // 接受一个参数,一元谓词
return val > 5;
}
};
// 示例1 主函数
void example1() {
vector<int> v;
for (int i = 0; i < 10; i++) {
v.push_back(i);
}
// 查找容器中有没有大于5的元素。如果找到,则返回元素所在位置迭代器;如果没找到,返回v.end()
vector<int>::iterator pos = find_if(v.begin(), v.end(), GreaterFive()); // GreaterFive()匿名函数对象
if (pos == v.end()) cout << "未找到" << endl;
else cout << "找到了大于5的数字为:" << *pos << endl;
// out: 找到了大于5的数字为:6
}
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
➰ 示例2:二元谓词
#include <iostream>
#include <string>
#include <algorithm> // sort()
#include <vector>
using namespace std;
class MyCompare {
public:
// 重载()操作符
bool operator() (int v1, int v2){
return v1 > v2;
}
};
// 示例2 主函数
void example2() {
vector<int> v;
v.push_back(10);
v.push_back(40);
v.push_back(20);
v.push_back(30);
v.push_back(50); // v = (10,40,20,30,50)
// 使用函数对象,改变策略算法,变为从大到小的排序
sort(v.begin(), v.end()); // v = (10,20,30,40,50)
sort(v.begin(), v.end(), MyCompare()); // v = (50,40,30,20,10)
}
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
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
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
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
# 内建函数对象
📋 概念: STL内建了一些函数对象,这些仿函数所产生的对象,用法和一般函数完全相同。
- 分类:
- 算术仿函数
- 关系仿函数
- 逻辑仿函数
- 使用内建函数对象,需要引入头文件
#include<functional>
← 📮 STL 常用容器 🗃 案例 →