priority_queue<T, Container, Compare>
可以看出,创建一个优先队列默认需要三个参数(实际应用上有些参数可以省去)。参数解释:
T:队列中元素的数据类型
Container: 用于储存和访问队列元素的底层容器的类型。
Compare: 比较关系,默认是数值上的小于关系,比如1<2,6<7,此时队列中元素由队头到队由大到小排列,采用默认compare时此参数可以省去。当需要采用其它标准进行比较时需要额外定义这一比较方式(下例示)。当满足比较关系”<”时,返回true,否则返回false。
比较关系与sort有点不同:
sort是按逻辑顺序比如
bool cmp(int a,int b) {return a<b} a是否在前看a是否满足a<b;
priority_queue则是:
bool operator ()(int a,int b) {return a<b} 默认b的优先级是大于a的,所以优先级高的要大所以是最大堆。
自定义优先级时可以定义在struct 内指定命名域,而当自定义struct的优先级时,用成员方式重载运算符, 不能改变参数的个数 ,二元运算符用成员重载时, 只需要一个参数, 另一个参数由this指针传入 。如果需要两个参数,那么可以在类外面定义,然后在类里声明为友元。
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<vector>
#define LL long long
using namespace std;
struct cmp1
{
bool operator ()(int a,int b)
{
return a>b;//最小堆
}
};
struct cmp2
{
bool operator ()(int &a,int &b)
{
return a<b;//最大值优先
}
};
struct node1
{
int u;
bool operator < (const node1 &a) const
{
return u>a.u;//最小值优先
}
};
struct node2
{
int u;
node2(int a)
{
u=a;
}
friend bool operator < (node2 a,node2 b) //用成员方式重载运算符, 不能改变参数的个数 ,二元运算符用成员重载时, 只需要一个参数, 另一个参数由this指针传入 。如果需要两个
//参数,那么可以在类外面定义,然后在类里声明为友元。
{
return a.u<b.u;//最大值优先
}
};
int main()
{
priority_queue<int> q; //为less大顶堆
priority_queue<int,vector<int>,cmp1 > q1; //最小堆
priority_queue<node2>q2; //最大堆
q2.push(node2(1));
q2.push(node2(2));
while(!q2.empty())
{
printf("%d ",q2.top().u);
q2.pop();
}
return 0;
}