在C++标准库中,priority_queue 是一个容器适配器,它提供了队列的所有基本操作,包括元素的入队(push)和出队(pop),但是出队操作(top 和 pop)总是返回(并移除)优先级最高的元素。默认情况下,priority_queue 使用 std::vector 作为底层容器,并使用 std::less 作为比较对象,因此它实现了一个最大堆。
priority_queue 的典型声明如下:
std::priority_queue<T, Container, Compare> pq;
T是队列中元素的类型。Container是用来存储元素的底层容器类型,默认为std::vector<T>。Compare是一个二元谓词,用于比较队列中的元素,以确定它们的优先级。默认为std::less<T>,这意味着较大的元素具有更高的优先级。
对于最大堆,你不需要显式指定 Container 和 Compare,因为默认设置就是你想要的。但是,如果你想实现一个最小堆(即优先级最低的元素先出队),你需要提供一个不同的比较对象,如 std::greater<T>。
以下是一些 priority_queue 的基本操作:
push(const value_type& val): 将元素添加到队列中。top(): 返回队列中优先级最高的元素(但不移除它)。pop(): 移除队列中优先级最高的元素。empty() const: 如果队列为空,则返回true。size() const: 返回队列中元素的数量。
下面是一个简单的 priority_queue 使用示例,展示了如何创建最大堆,并向其中添加元素、获取顶部元素和删除元素:
#include <iostream>
#include <queue> // 包含priority_queue的定义 int main() { std::priority_queue<int> pq; // 创建一个int类型的最大堆 // 向优先队列中添加元素 pq.push(3); pq.push(1); pq.push(4); // 输出并删除最高优先级的元素 while (!pq.empty()) { std::cout << pq.top() << ' '; // 输出当前最高优先级的元素 pq.pop(); // 删除最高优先级的元素 } return 0;
}
输出将是:
4 3 1
因为这是一个最大堆,所以数字 4(具有最高优先级)首先被输出和删除,然后是 3,最后是 1。
如果你想要实现一个最小堆,你可以这样声明 priority_queue:
std::priority_queue<int, std::vector<int>, std::greater<int>> pq;
现在,pq 将会按照升序排列元素,因此 top() 操作将返回最小的元素,而 pop() 操作将移除最小的元素。