目录
一、仿函数
①、概念:
仿函数,即函数对象。一种行为类似函数的对象,调用者可以像函数一样使用该对象,其实现起来也比较简单:用户只需实现一种新类型,在类中重载operator()即可,参数根据用户所要进行的操作选择匹配。
②、代码:
- 用内置类型比较大小关系:
//仿函数/函数对象 --- 对象可以像调用函数一样去使用 struct less { //()运算符重载--用于比较大小 bool operator()(int x, int y) { return x < y; } };
- 利用模板比较less:
template<class T> struct less//用于 < 的比较 { bool operator()(const T& x, const T& y) const { return x < y; } };
- 利用模板比较greater
template<class T> struct greater//用于 > 的比较 { bool operator()(const T& x, const T& y) const { return x > y; } };
③、测试:
//测试less less<int> LessFunc; cout << LessFunc(1, 2) << endl;//1 //测试greater greater<int> GreaterFunc; cout << GreaterFunc(1, 5) << endl;//0
为什么说仿函数又叫函数对象?
比如测试代码中的LessFunc,它是个对象,但他调用时直接写为LessFunc(1, 2),就像一个函数在调用,但他并不是函数,调用的本质是lessFunc.operator()(1, 2),所以仿函数即对象可以像函数一样使用
④、algorithm中的sort
sort的第三个参数使用到了仿函数,其为仿函数的对象(第三个参数还可以是函数指针,以及后续讲的lambda表达式)
第一个参数和第二个参数都是迭代器,第三个参数可以是仿函数,其默认值为less
升序:less < 降序:greater >
注:第三个参数不传默认是less,即排升序
#include<iostream> #include<algorithm> using namespace std; void test_sort() { vector<int>v; v.push_back(1); v.push_back(4); v.push_back(5); v.push_back(2); //升序,l