优先队列是一个堆实现的
定义:priority_queue<T, Container < T>, Function < T> >
也可以不写后两部分内容,默认从大到小排序
T 就是数据类型,
Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector)
Function就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆
priority_queue:优先队列,自动排序,默认为优先级较高的在前,但是要注意的是,它对int型变量的默认排序是从大到小,因为它认为值越大,优先级越高,与sort排序刚好相反。
1.对int型变量
priority_queue<int, vector < int > ,less < int > >从大到小排列
priority_queue<int , vector < int >,greater< int> >从小到大排列
2.对结构体排序,要重载一下 " < ",只能重载小于号
因为priority_queue默认的less,所以要想重载大于号,就需要把function改为greater,不过只重载一个小于号已经够用了。
从大到小排列
struct node{
int x;
int y;
friend bool operator < (const node & a,const node & b)
{
if(a.x!=b.x)
return a.x<b.x;
else
return a.y<b.y;
}
};
priority_queue<node > q;
从小到大排列
struct node{
int x;
int y;
friend bool operator < (const node & a,const node & b)
{
if(a.x!=b.x)
return a.x>b.x;
else
return a.y>b.y;
}
};
priority_queue<node > q;
从小到大排列也可以重载大于号
struct node{
int x;
int y;
friend bool operator > (const node & a,const node & b)
{
if(a.x!=b.x)
return a.x>b.x;
else
return a.y>b.y;
}
};
priority_queue<node, vector<node> ,greater<node> > q;