📅  最后修改于: 2023-12-03 15:29:42.860000             🧑  作者: Mango
优先级队列是一种特殊的队列,它的元素按照优先级排序。当我们向优先级队列中添加元素时,它会根据元素的优先级自动进行排序,最高优先级的元素始终位于队列的开头。当我们从优先级队列中取出元素时,它会返回队列中最高优先级的元素。
在C++中,优先级队列是通过头文件<queue>
中的priority_queue
类实现的。
在C++中,如果我们使用默认的优先级队列,它会将元素按照从大到小的顺序进行排序。也就是说,较小的元素具有较高的优先级,它们将位于队列的开始位置。
下面是一个简单的例子,用于说明默认排序方式:
#include <iostream>
#include <queue>
using namespace std;
int main () {
priority_queue<int> pq;
pq.push(10);
pq.push(30);
pq.push(20);
while (!pq.empty()) {
cout << pq.top() << " ";
pq.pop();
}
return 0;
}
输出结果为:
30 20 10
从结果可以看出,优先级队列默认按照从大到小的顺序进行排序,最高优先级的元素为30,其次是20,最低优先级的元素是10。
如果我们想要按照自己的方式对优先级队列中的元素进行排序,可以通过传递一个比较函数来实现。比较函数必须返回一个布尔值,如果第一个参数比第二个参数小,则返回true,否则返回false。
下面是一个例子,它按照元素的第一个和第二个属性对元素进行排序:
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
struct Element {
int x, y;
};
struct Compare {
bool operator()(const Element& a, const Element& b) const {
if (a.x == b.x) {
return a.y > b.y;
}
return a.x > b.x;
}
};
int main () {
priority_queue<Element, vector<Element>, Compare> pq;
pq.push({3, 4});
pq.push({1, 2});
pq.push({1, 3});
pq.push({2, 1});
while (!pq.empty()) {
auto [x, y] = pq.top();
cout << "(" << x << ", " << y << ") ";
pq.pop();
}
return 0;
}
输出结果为:
(1, 2) (1, 3) (2, 1) (3, 4)
从结果可以看出,优先级队列按照元素的第一个属性进行排序,如果第一个属性相同,则按照第二个属性进行排序。在这个例子中,(1,2)的第一个属性最小,因此它具有最高的优先级,而(3,4)的第一个属性最大,因此它具有最低的优先级。如果第一个属性相同,则元素的第二个属性决定它们的先后顺序。
优先级队列是一种非常有用的数据结构,它可以帮助我们轻松地对元素进行排序。在C++中,我们可以使用默认的排序方式,也可以通过自定义比较函数来实现特定的排序方式。无论你是在写算法竞赛的代码,还是在处理实际的编程问题,优先级队列都是一种非常有用的工具。