priority_queue
是优先队列,就像普通队列一样,只是队列中的第一个元素是队列中所有元素中最大的,算是C ++中的堆的一种实现,priority_queue
默认是最大堆。元素可以任意的顺序插入,插入的时间复杂度为O(logn)
。
创建int
类型的优先级队列的语法:
priority_queue <int> pq;
push
函数:在priority_queue
中插入一个元素,时间复杂度为O(logn)
。pop
函数:从priority_queue
中删除最上面的元素(最大元素),并将优先级队列的大小减小1。top
函数:返回在priority_queue
顶部的元素,该元素是队列中存在的最大元素。size
函数:返回priority_queue
的元素个数。empty
函数:返回true
和false
,如果priority_queue
为空,则返回true
,否则返回false
。swap
函数:交换两个priority_queue
的值。#include
#include
using namespace std;
void showpq(priority_queue <int> pq)
{
while (!pq.empty())
{
cout << ' ' << pq.top();
pq.pop();
}
cout << '\n';
}
int main()
{
priority_queue <int> pq1;
pq1.push(10); // inserts 10 to pq1 , now top = 10
pq1.push(30); // inserts 30 to pq1 , now top = 30
pq1.push(20); // inserts 20 to pq1 , now top = 30
pq1.push(50); // inserts 50 to pq1 , now top = 50
pq1.push(90); // inserts 90 to pq1 , now top = 90
cout << "The priority_queue pq1 is:";
showpq(pq1);
cout << "\npq1.size():" << pq1.size();
cout << "\npq1.top():" << pq1.top();
cout << "\npq1.pop()\n";
pq1.pop(); // remove 90 to pq1 , now top = 50
cout << "The priority_queue pq1 is:";
showpq(pq1);
priority_queue <int> pq2;
pq2.push(3);
pq2.push(5);
pq2.push(7);
pq2.push(9);
cout << "The priority_queue pq2 is:";
showpq(pq2);
pq1.swap(pq2);
cout << "after swap:" << endl;
cout << "The priority_queue pq1 is:";
showpq(pq1);
cout << "The priority_queue pq2 is:";
showpq(pq2);
system("pause");
return 0;
}
运行结果:
The priority_queue pq1 is: 90 50 30 20 10
pq1.size():5
pq1.top():90
pq1.pop()
The priority_queue pq1 is: 50 30 20 10
The priority_queue pq2 is: 9 7 5 3
after swap:
The priority_queue pq1 is: 9 7 5 3
The priority_queue pq2 is: 50 30 20 10
请按任意键继续. . .
语法:
priority_queue<int, vector<int>, greater<int> > pq;
其中,greater
是STL
内建的关系运算类函数对象(也就是仿函数),并且是一个二元运算符。
template<class T> bool greater<T> //大于
#include
#include
using namespace std;
template<typename T> void print_queue(T& q) {
while (!q.empty()) {
cout << q.top() << " ";
q.pop();
}
cout << '\n';
}
void showpq(priority_queue <int> pq)
{
while (!pq.empty())
{
cout << ' ' << pq.top();
pq.pop();
}
cout << '\n';
}
int main() {
priority_queue<int> pq1; // 最大堆
for (int n : {1, 8, 5, 6, 3, 4, 0, 9, 7, 2})
pq1.push(n);
print_queue(pq1);
priority_queue<int, vector<int>, greater<int> > pq2; // 最小堆
for (int n : {1, 8, 5, 6, 3, 4, 0, 9, 7, 2})
pq2.push(n);
print_queue(pq2);
system("pause");
return 0;
}
运行结果:
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9
请按任意键继续. . .
前面都是用的int
类型的优先队列,如果是自定义数据类型,比如结构体和类,那么怎么使用优先队列呢?
有一个Person
结构体,含有两个变量Age
和Height
,定义如下:
struct Person{
int Age;
float Height;
}
在定义优先队列的时候,priority_queue
,程序并不知道该如何对Person
这种数据类型排序,就会报错。这时就需要运算符重载或者写仿函数来定义优先级,使得优先队列知道如何存储数据。对于自定义Person
类型。
#include
#include
using namespace std;
#define ROW 5
#define COL 2
struct Person {
int age;
float height;
// 初始化结构体变量
Person(int age, float height)
: age(age), height(height)
{
}
};
// 重载 operator<
bool operator<(const Person& p1, const Person& p2) {
return p1.height < p2.height;
}
int main()
{
priority_queue<Person> pq;
float arr[ROW][COL] = { { 30, 5.5 }, { 25, 5 },
{ 20, 6 }, { 33, 6.1 }, { 23, 5.6 } };
for (int i = 0; i < ROW; ++i) {
// 使用Person的构造函数生成的临时变量,压到优先队列pq中
pq.push(Person(arr[i][0], arr[i][1]));
}
while (!pq.empty()) {
Person p = pq.top();
pq.pop();
cout << p.age << " " << p.height << "\n";
}
system("pause");
return 0;
}
#include
#include
using namespace std;
#define ROW 5
#define COL 2
struct Person {
int age;
float height;
// 初始化结构体变量
Person(int age, float height)
: age(age), height(height)
{
}
};
// 仿函数,里面实现了Person类型的()运算符重载函数
struct CompareHeight {
bool operator()(Person const& p1, Person const& p2)
{
return p1.height < p2.height; // 升序
}
};
int main()
{
priority_queue<Person, vector<Person>, CompareHeight> pq;
float arr[ROW][COL] = { { 30, 5.5 }, { 25, 5 },
{ 20, 6 }, { 33, 6.1 }, { 23, 5.6 } };
for (int i = 0; i < ROW; ++i) {
// 使用Person的构造函数生成的临时变量,压到优先队列pq中
pq.push(Person(arr[i][0], arr[i][1]));
}
while (!pq.empty()) {
Person p = pq.top();
pq.pop();
cout << p.age << " " << p.height << "\n";
}
system("pause");
return 0;
}
运行结果:
33 6.1
20 6
23 5.6
30 5.5
25 5
请按任意键继续. . .
https://www.geeksforgeeks.org/priority-queue-in-cpp-stl/
https://en.cppreference.com/w/cpp/container/priority_queue
https://www.geeksforgeeks.org/stl-priority-queue-for-structure-or-class/