112 C++ STL 函数对象回顾,系统函数对象以及范例
回顾
函数对象/也叫仿函数
如下的这几类都叫做函数对象。
一般的说法,只是认为 Teacher重写了operator()()的才是仿函数,
Teacher tea;
tea();//实际上调用了operator()(),tea()看起来像一个函数调用,因此叫做仿函数。
实际上 可以将 函数,可调用对象,lambda表达式都看成是函数对象,或者仿函数。
函数对象 function object
仿函数 functors
在STL 中函数对象一般来说,仿函数都是和算法配合一起使用,从而实现一些特定的功能。
也就是说:这些函数对象主要是用来服务于算法
#include <algorithm>
//仿函数回顾,从下面对于 operator()()的重载可以看出,仿函数的作用很多,
//如下的例子只是在sort 算法的时候做为第三个参数使用的情况
class Teacher7 {
public:
Teacher7() {
}
~Teacher7(){
}
Teacher7(const Teacher7 &obj) {
this->mage = obj.mage;
}
Teacher7 operator= (Teacher7 &obj) {
this->mage = obj.mage;
return *this;
}
//重写了operator ()函数的类,就是仿函数
bool operator()(int i, int j) {
return i > j;
}
//仿函数可以重载
int operator()(int i) {
return i + 10;
}
int mage;
};
void main() {
bool rese = Teacher7()(2,3);
cout << "rese = " << rese << endl;
vector<int> myvector1 = { 30,20,800,60,90890,989898 };
Teacher7 tea;
sort(myvector1.begin(), myvector1.end(),tea);
for (auto it = myvector1.begin(); it != myvector1.end(); ++it) {
cout << " " << *it;
}
}
标准库中定义的函数对象
标准库中也给我们提供了很多可以现成拿来使用的函数对象。
要使用这些现成的 函数对象,要包含一个头文件 functional
#include <functional>
标准库中定义的函数对象范例
#include <algorithm>
#include <functional>
void main() {
vector<int> vec = { 68,98,56,93569,89898 };
sort(vec.begin(), vec.end(), greater_equal<int>());
//sort 是算法,需要三个参数,第一个和第二个是容器的iterator- 代表范围,第三个参数我们这里使用的是 C++编译器自带的 函数对象
//greater_equal<int> 是类,greater_equal<int>()临时对象
for (auto it = vec.begin(); it != vec.end(); ++it) {
cout << " " << *it;
}
//93569 89898 98 68 56
greater_equal<int> aa;
sort(vec.begin(), vec.end(), aa);
//把 greater_equal<int>看成一个类, aa就是这个类的实例
//就像Teacher7 是一个类,Teacher7 bb; bb就是这个类的实例
sort(vec.begin(), vec.end(), Teacher7());
sort(vec.begin(), vec.end(), greater_equal<int>());
}
看一下,目前的进度。