include <queue>
程序中,使用基本数据类型“string”以及自定义数据类型Data,分别构造了优先级队列。然后通过运算符重载和重写仿函数来支持自定义的数据类型(两种方法都写了,代码中用的是运算符重载)。
#include <iostream>
#include <queue>//使用队列需要引用<queue>头文件
#include <string>
using namespace std;
//自定义数据类型,Data类
class Data
{
public:
Data(int i, int d) :id(i), data(d) {}
~Data() {}
int getId() { return id; }
int getData() { return data; }
friend bool operator < (const Data &a, const Data &b);//运算符重载,友元函数可以访问类的私有成员
private:
int id;
int data;
};
//重载“<”运算符,仿函数less中需要使用
bool operator < (const Data &a, const Data &b) {
return a.id < b.id;
}
//重写仿函数,完成less的功能,用class的时候,需要public关键词(因为struct中默认数据是public,而class中默认是private)
class cmp
{
public:
bool operator() ( Data &a, Data &b) {
return a.getId() < b.getId();
}
};
int main()
{
//基本数据类型示例
priority_queue<string, vector<string>, greater<string> > p;//维护一个小顶堆,最小的元素优先级最高,最先出队
p.push("C");
p.push("B");
p.push("A");
cout << p.top() << endl;//队列中优先级最高的是最后进队的“A”
//自定义数据类型示例
priority_queue<Data, vector<Data>, less<Data> > priQueMaxFirst;//该优先级队列维护一个大顶堆,因此最大的元素最先出队
//构造一个优先级队列
for (int i = 0; i < 4; ++i) {
Data tmpData(i, 0 - i);
priQueMaxFirst.push(tmpData);
}
//打印当前队列中优先级最高的元素,然后将其出队
while (!priQueMaxFirst.empty()) {
Data topData = priQueMaxFirst.top();//top()与pop()搭配,获得队列中优先级最高的元素,然后将其出队
priQueMaxFirst.pop();
cout << "ID: " << topData.getId() << " " << " Data: " << topData.getData() << endl;//打印当前队列中优先级最高的元素
}
return 0;
}