**prioroty_queue我们可以认为就是一个堆,我们堆的性质和std里面的这个容器其实定义性质都是差不多的。
在默认情况了,qriority_queue堆顶元素是最大的,也就是大堆,但是我们往往知道如果是内置类型我们想换成小堆只需要加上priority<int, vector,greater>就可以了这样也是比较简单的,虽然加上这么一个堆转换语句看起来一下子边长了,好像变麻烦了,但是这个语句也是想当好记的,至少给priority这个单词好记。
好了,进入正题吧,我们是要重载自定义类型,那么自定义类型的堆数据应该如何重载呢?
比如我们想重载一个日期类:例如d1(2019,1,7) d2(2019,1,8) d3(2019,1,9) d4(2019,1,10) d5(2019,1,11)显然堆顶元素应该是d5的,但是这个比较就比较不一样了,我们需要对年月日经行比较。这个样我们必需对自定义类型类当中经行运算符重载提供两个这样的比较函数== "operator < "== "operator > "
- 好了类看一下基本的设置吧
#include <vector>
#include <queue>
#include <functional> // greater算法的头文件
class Date {
public:
Date(int year = 1900, int month = 1, int day = 1)
: _year(year)
, _month(month),
_day(day) {}
bool operator<(const Date& d)const
{
return (_year < d._year) ||
(_year == d._year && _month < d._month) ||
(_year == d._year && _month == d._month && _day < d._day);
}
bool operator>(const Date& d)const
{ return (_year > d._year) ||
(_year == d._year && _month > d._month) ||
(_year == d._year && _month == d._month && _day > d._day);
}
friend ostream& operator<<(ostream& _cout, const Date& d)
{
_cout << d._year << "-" << d._month << "-" << d._day;
return _cout; }
private:
int _year;
int _month;
int _day;
};
void TestPriorityQueue() {
// 大堆,需要用户在自定义类型中提供<的重载
priority_queue<Date> q1;
q1.push(Date(2018, 10, 29));
q1.push(Date(2018, 10, 28));
q1.push(Date(2018, 10, 30));
cout << q1.top() << endl;
// 如果要创建小堆,需要用户提供>的重载
priority_queue<Date, vector<Date>, greater<Date>> q2;
q2.push(Date(2018, 10, 29));
q2.push(Date(2018, 10, 28));
q2.push(Date(2018, 10, 30));
cout << q2.top() << endl;
}
int main()
{
TestPriorityQueue();
return 0;
}
好了,自定义类型堆创建成功。