优先队列本质上还是属于队列的范畴,只不过多了一项功能,根据用户自定义的数据进行任意规则的动态排序。
它的模板声明包括三个参数,priority_queue(Type,Container,Functional)
第一个是数据类型,可以是整型、结构体类型、类类型等等,第二个参数是容器,一般是vector或者deque,第三个是比较函数,默认缺省的是vector,operator < ,也就是说默认排序是按照从大到小的顺序排的,因为优先队列是大顶堆,队头元素最大。
下面的程序分别是按照 基本数据类型从大到小排,从小到大排,类类型使用仿函数按指定元素从小到大排。
有一个概念需要解释一下,“仿函数”。所谓仿函数,就是使一个类的使用看上去像一个函数。其实现就是在类中实现一个operator(),这个类就拥有了类似函数的行为,就是一个仿函数类了。在C++中,我们通过在一个类中重载括号运算符的方法使用一个函数对象而不是一个普通函数。
#include <iostream>
#include <queue>
using namespace std;
int main(){
priority_queue<int,vector<int>>que;
int a[] = {3,1,5,2,8,8,0};
for(int i=0;i<sizeof(a)/sizeof(int);i++){
que.push(a[i]);
}
while(!que.empty()){
cout<<que.top()<<" ";
que.pop();
}
cout<<endl;
return 0;
}
#include <iostream>
#include <queue>
using namespace std;
int main(){
priority_queue<int,vector<int>,greater<int>>que;
int a[] = {3,1,5,2,8,8,0};
for(int i=0;i<sizeof(a)/sizeof(int);i++){
que.push(a[i]);
}
while(!que.empty()){
cout<<que.top()<<" ";
que.pop();
}
cout<<endl;
return 0;
}
#include <iostream>
#include <queue>
using namespace std;
class T{
public:
int x;
int y;
int z;
T(int a,int b,int c):x(a),y(b),z(c){} //构造函数
};
struct cmp1{
bool operator()(const T &t1,const T &t2){
return t1.z > t2.z; //根据z的值的大小进行排列
}
};
int main(){
priority_queue<T,vector<T>,cmp1>que;
T a(1,2,3);
T b(6,4,2);
T c(7,5,6);
que.push(a);
que.push(b);
que.push(c);
while(!que.empty()){
cout<<que.top().x<<" "<<que.top().y<<" "<<que.top().z<<endl;
que.pop();
}
cout<<endl;
return 0;
}