仿函数(函数对象)
研究set/multiset容器的排序原理。
当我们构造一个存放int类型的set容器时
系统会自动帮我们设定并调用一个函数,自动调用头文件functional中的仿函数(一个类中重载了()实现了对比的操作,从而完成了排序)。
less函数对象实现比较,为排序提供依据。(升序)
greater(降序)
functional中,如图
手动实现:
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 37 38 39 40 41 42
| #include<iostream> #include<set> using namespace std; class Student { public: Student(int _age):age(_age) {
} int getAge()const { return age; } bool operator < (const Student& right) const { return this->age < right.age; }
bool operator > (const Student& right) const { return this->age > right.age; }
~Student() { } private: int age; };
int main(void) { set<Student,greater<Student>> setStu; setStu.insert(19); setStu.insert(20); setStu.insert(18);
for (set<Student>::iterator it = setStu.begin(); it != setStu.end(); it++) { cout << it->getAge()<< endl; } return 0; }
|
如果一个类将()运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象。函数对象是一个对象,但是使用的形式看起来像函数调用,实际上也执行了函数调用,因而得名。——C++函数对象详解
实现自己的less(greater)达到效果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class FuncStudent { public: bool operator()(const Student& left, const Student& right)const { return left.getAge() > right.getAge(); } }; int main(void) { set<Student,FuncStudent> setStu; Student s1(12); Student s2(13); setStu.insert(s1); setStu.insert(s2); for (set<Student,FuncStudent>::iterator it = setStu.begin(); it != setStu.end(); it++) { cout << it->getAge()<< endl; } return 0; }
|
仿函数(函数对象)概念
- 尽管函数指针被广泛用于实现函数回调,但C++还提供了一个重要的实现回调函数的方法,那就是函数对象。回调函数解释——回调函数
- functor,翻译成函数对象,伪函数,它是是重载了“()”操作符的普通类对象。从语法上讲,它与普通函数行为类似。
- functional头文件中包含的 greater<>与less<>就是函数对象。
set/setmulti容器就是调用函数对象的operator()方法去比较两个值的大小,从而实现的排序。