📅  最后修改于: 2023-12-03 14:39:59.772000             🧑  作者: Mango
优先级队列是C++标准模板库(STL)中的一个容器适配器,用于实现具有优先级的数据结构。它允许在插入数据时自动按照一定的顺序进行排序,并在访问元素时返回具有最高优先级的元素。
优先级队列是基于堆实现的,可用于解决很多实际问题,如任务调度、数据压缩、贪心算法等。
要使用优先级队列,需要包含C++标准库中的 <queue>
头文件。
#include <queue>
然后,可以声明一个优先级队列对象,并指定元素类型和排序方式。
std::priority_queue<int> pq; // 默认以降序排列
要向优先级队列中插入元素,可以使用 push()
成员函数。
pq.push(10);
pq.push(5);
pq.push(20);
在上述例子中,插入元素10后,队列变为 {10}
;再插入元素5后,队列变为 {10, 5}
;最后插入元素20后,队列变为 {20, 10, 5}
。
要访问优先级队列中具有最高优先级的元素,可以使用 top()
成员函数。
int highest = pq.top(); // 返回最高优先级元素,此时为20
要删除优先级队列中具有最高优先级的元素,可以使用 pop()
成员函数。
pq.pop(); // 删除最高优先级元素,队列变为 `{10, 5}`
默认情况下,优先级队列以降序排列,也就是具有较大值的元素具有较高优先级。如果需要自定义排序方式,可以提供一个自定义的比较函数。
// 自定义比较函数
bool compare(int a, int b) {
return a < b; // 以升序排列
}
std::priority_queue<int, std::vector<int>, compare> pq;
优先级队列可以存储自定义类型的对象,只需确保元素类型具有可比较性。以下是一个示例:
#include <iostream>
#include <queue>
#include <string>
// 自定义对象
class Person {
public:
std::string name;
int age;
Person(std::string n, int a) : name(n), age(a) {}
};
// 自定义比较函数
struct Compare {
bool operator()(Person const& p1, Person const& p2) {
return p1.age < p2.age;
}
};
int main() {
std::priority_queue<Person, std::vector<Person>, Compare> pq;
pq.push(Person("Alice", 25));
pq.push(Person("Bob", 20));
pq.push(Person("Charlie", 30));
// 访问具有最高优先级的Person对象
Person highest = pq.top();
std::cout << highest.name << " is " << highest.age << " years old." << std::endl;
return 0;
}
在上述示例中,自定义了一个 Person
类,然后使用自定义的比较函数 Compare
对其进行排序。最后,通过访问 top()
方法获取队列中具有最高优先级的Person对象。
优先级队列是C++标准模板库中强大的工具,它提供了自动排序和访问具有最高优先级元素的功能。无论您是处理实际问题还是在算法设计中使用优先级队列,了解其使用方法和特性都是非常重要的。
更多关于优先级队列的细节和使用情况,请查阅C++标准库文档。