priority_queue优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素.但是它有一个特性,就是队列最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队.这点类似于给队列里的元素进行了由大到小的顺序排序.元素的比较规则默认按元素的值由大到小排序,当然,可以重载"<"操作符来从新定义比较规则.
案例1:
重载"<"操作符来定义优先级
如果优先队列的元素类型是结构体,可以通过在结构体中重载"<"操作符的方法来修改优先队列的优先性.
#include <queue>
#include <string>
#include <iostream>
using namespace std;
//定义结构体
struct Info {
string name;
float score;
//重载"<"操作符,指定优先规则(排序规则)
bool operator < (const Info &a) const {
//按score由从小到大排列.如果要由大到小排列,使用">"号即可
return a.score < score;
}
};
int main()
{
//定义优先队列,元素类型为Info结构体
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);
//元素全部出队
while(pq.empty() != true) {
//返回队首元素
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()
{
//定义优先队列,元素类型为int型,显示说明内部结构式vector
priority_queue<int, vector<int>, myComp> pq;
//入队
pq.push(1);
pq.push(9);
pq.push(2);
pq.push(30);
//元素全部出队
while(pq.empty() != true) {
//返回队首元素
cout << pq.top() << " ";
//出队,删除队首元素
pq.pop();
}
cout << endl;
return 0;
}
案列3:
像int,float,double,char这样的类型可以用更简单的代码来实现由小到大的排列.
#include <queue>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
//定义优先队列,元素类型为int型,显示说明内部结构式vector
priority_queue<int, vector<int>, greater<int> > pq;
//入队
pq.push(1);
pq.push(9);
pq.push(2);
pq.push(30);
//元素全部出队
while(pq.empty() != true) {
//返回队首元素
cout << pq.top() << " ";
//出队,删除队首元素
pq.pop();
}
cout << endl;
return 0;
}