一、前言
昨晚受高人指点:如何实现当优先队列里的元素是结构体时,按照指定要求排序——利用操作符重载。现把这个方法分享给大家~
二、优先队列
首先认识优先队列:
优先队列的本质是堆,但它具有队列的所有操作,比如push(),pop(),top(),empty()…;它与普通队列不同的是它会自动按照优先级顺序排序,相当于在队列的基础上加了个堆排序
头文件:<queue>、<functional>
大顶堆(降序)定义 默认
priority_queue<int> big_heap;
小顶堆(升序)定义 需要加参数
priority_queue<int,vector<int>,greater<int> > small_heap;
现在我们思考,如果我们要加入这个优先队列的不是一个数字,而是一个结构体,应该怎么按照指定规则排序呢?
例如:现在我们要把node放进优先队列里,并要求队头是v最大的节点,如果v相同,则取inx最小的
struct node{
int v;
int inx;
};
为达目的我们需要在结构体里重载操作符 < (重载小于号和重载大于号是等价的)
struct node{
int v;
int inx;
//构造函数
node(int vv,int inxx){
v=vv;
inx=inxx;
}
//析构函数
~node(){
}
//小于运算符重载
bool operator < (const node&right) const {
if(v!=right.v) return v<right.v
else inx>right.inx
}
}a[N];
是不是感觉和面向对象编程时使用class几乎一模一样,其实就是一个道理,习惯用class的同学直接用class取代struct也是可以的
如果希望队头是v最小的节点,如果v相同,则取inx最小的,改一下下面第二行代码就可以啦
bool operator < (const node&right) const {
if(v!=right.v) return v>right.v
else inx>right.inx
}