优先队列是一种容器适配器,他的第一个元素(位于头部top)总是队列中最大的元素,这里的"最大"是指队列元素的严格弱序中的"最大"。严格弱序是一系列数或事物按照一定的比较关系"<"排列得出的序列,"<"可以是数学中进行数值比较的大于,也可以是小于,还可以是其他含义。
priority_queue 优先队列容器使用堆排序算法,每次将最大值或最小值出列。时间复杂度为O(nlogn)。
创建一个优先队列的格式为 priority_queue<T, Container, Compare>,可以看出,创建一个优先队列默认需要三个参数(实际应用上有些参数可以省去)。参数解释:
T: 队列中元素的数据类型。
Container: 用于存储和访问队列元素的底层容器的类型。
Compare: 比较关系,默认是数值上的小于关系,比如 1<2, 6<7,此时队列中元素由队头到队尾由大到小排列,采用默认compare 时此参数可以省去。当需要采用其他标准进行比较时需要额外定义这一比较方式。当满足比较关系"<"时,返回 true,否则返回false。
priority_queue 优先队列容器使用堆排序算法,每次将最大值或最小值出列。时间复杂度为O(nlogn)。
创建一个优先队列的格式为 priority_queue<T, Container, Compare>,可以看出,创建一个优先队列默认需要三个参数(实际应用上有些参数可以省去)。参数解释:
T: 队列中元素的数据类型。
Container: 用于存储和访问队列元素的底层容器的类型。
Compare: 比较关系,默认是数值上的小于关系,比如 1<2, 6<7,此时队列中元素由队头到队尾由大到小排列,采用默认compare 时此参数可以省去。当需要采用其他标准进行比较时需要额外定义这一比较方式。当满足比较关系"<"时,返回 true,否则返回false。
参考代码如下所示:
#include<queue>
#include<iostream>
#define STACK_SIZE 100
using namespace std;
int main()
{
priority_queue <int> q;
q.push(93);
q.push(5);
q.push(2);
q.push(33);
q.push(52);
q.push(12);
cout<<"元素个数为:"<<q.size()<<endl;
while(!q.empty())
{
cout<<q.top()<<endl; //取队首元素
q.pop(); //出队列要先判断是否为空
}
return 0;
}
另一个参考代码如下:
#include<iostream>
#include<queue>
using namespace std;
class cmp{
public:
bool operator() (const int a,const int b){
return a>b;
}
};
int main()
{
priority_queue<int,vector<int>,cmp>que1;
priority_queue< int,vector<int> >que2;
int a[]= {1,3,4,2,5,0,6};
for(int i=0; i<7; i++){
que1.push(a[i]);
que2.push(a[i]);
}
cout<<"que1:";
while(!que1.empty()){
cout<<que1.top()<<" ";
que1.pop();
}
cout<<endl<<"que2:";
while(!que2.empty()){
cout<<que2.top()<<" ";
que2.pop();
}
return 0;
}