前言:
priority_queue优先队列容器与队列一样,这能从队尾插入元素,从对手删除元素。但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队。这点类似与给队列里的元素进行了由大到小的顺序排序。元素的比较规则默认为按照元素的值由大到小排序;当然,可以重载“<”操作符来重新定义比较规则。
使用priority_queue需要声明头文件包含语句:“#include<queue>”。它与queue共用一个头文件。
优先队列的使用方法
优先队列包含入队push()(插入元素),出队pop()(删除元素),读取队首元素top(),判断队列是否为空empty()和读取队列元素数量size()等方法。
下面这个程序详细说明了优先队列的使用方法:
#include<queue>
#include<iostream>
using namespace std;
int main()
{
priority_queue<int>pq;
pq.push(1);
pq.push(2);
pq.push(3);
pq.push(9);
cout<<pq.size()<<endl;
while(!pq.empty())
{
cout<<pq.top()<<" ";
pq.pop();
}
cout<<endl;
return 0;
}
输出:
重载“<"操作符来定义优先级
如果优先队列的元素类型是结构体,可以通过在结构体中重载"<"操作符的方法来修改优先队列的优先性。
#include<queue>
#include<iostream>
using namespace std;
struct Info
{
string name;
float score;
bool operator < (const Info &a)const
{
return a.score<score;
}
};
int main()
{
priority_queue<Info>pq;
Info info;
info.name="Jack";
info.score=68.5;
pq.push(info);
info.name="Bomi";
info.score=18.5;
pq.push(info);
info.name="Peti";
info.score=90;
pq.push(info);
cout<<pq.size()<<endl;
while(!pq.empty())
{
cout<<pq.top().name<<" "<<pq.top().score<<endl;
pq.pop();
}
return 0;
}
输出:
重载“()”操作符来定义优先级
如果优先队列的元素不是结构体类型,则可以通过重载“()”,操作符的方式来定义优先级。当然,元素是结构体类型,也可以通过重载“()“操作符的方式来定义优先级,而不是要在结构体内重载”<"操作符才行。
#include<queue>
#include<vector>
#include<iostream>
using namespace std;
struct myComp
{
bool operator()(const int &a,const int &b)
{
return a>b;
}
};
int main()
{
priority_queue<int,vector<int>,myComp>pq;
pq.push(1);
pq.push(9);
pq.push(2);
pq.push(30);
cout<<pq.size()<<endl;
while(!pq.empty())
{
cout<<pq.top()<<" ";
pq.pop();
}
cout<<endl;
return 0;
}
输出: