# 🎲 STL 函数对象/仿函数

# 函数对象

📋 概念:

  • 重载函数调用操作符的类,其对象常称为函数对象
  • 函数对象使用重载的 () 时,行为类似函数调用,也叫仿函数
  1. 本质:函数对象(仿函数)是一个,不是一个函数
  2. 特点:
    • 函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值
    • 函数对象超出普通函数的概念,函数对象可以有自己的状态
    • 函数对象可以作为参数传递

# 谓词

📋 概念: 返回 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
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:二元谓词










 




 







 




#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
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

# 内建函数对象

📋 概念: STL内建了一些函数对象,这些仿函数所产生的对象,用法和一般函数完全相同。

  1. 分类:
    • 算术仿函数
    • 关系仿函数
    • 逻辑仿函数
  2. 使用内建函数对象,需要引入头文件 #include<functional>