之所以叫做仿函数:
是因为定义一个类:
这个类被重载了()运算符, Compare com; com.operator()(&d1, &d2);,这个时候对象调用operator(),时就好像函数调用一样
对比函数指针和函数类型的优点
priority_queue<Data*, vector<Data*>, Compare> q;
再看这个优先级队列的初始化,这个Compare这个时候就是一个类,,满足模板参数列表的需求,不用再定义函数类型,加函数指针
做法
只需要对定义的类型进行()运算符的重载
class Compare{
public:
bool operator()(const Data* pLeft, const Data* pRight){
return *pLeft < *pRight;
}
private:
};
#include <queue>
#include <functional>
using namespace std;
class Data{
public:
Data(int year = 2019, int month = 5, int day = 18)
:_year(year)
, _month(month)
, _day(day)
{}
bool operator <(const Data& d)const { //重载 < 号注意后面的参数括号中的this指针
return _day < d._day; //私有成员变量不能在类外使用,只能在类中使用
}
private:
int _year;
int _month;
int _day;
};
class Compare{
public:
// () 函数调用运算符
bool operator()(const Data* pLeft, const Data* pRight){
return *pLeft < *pRight;
}
private:
};
int main(){
Data d1(2019, 6, 27);
Data d2(2019, 6, 28);
Data d3(2019, 6, 29);
Data d4(2019, 6, 30);
Compare com;
com.operator()(&d1, &d2);
com(&d1, &d2);// 这种很像函数调用,但是com是一个对象,仅仅就是对象调用
priority_queue<Data*, vector<Data*>, Compare> q;
q.push(&d1);
q.push(&d2);
q.push(&d3);
q.push(&d4);
system("pause");
return 0;
}