C++STL:优先级队列的原理,接口及使用
时间: 2024-10-23 11:07:41 浏览: 21
C++标准模板库(Standard Template Library, STL)中的`priority_queue`是一个容器适配器,它实现了堆数据结构,主要用于存储具有优先级的元素。堆是一种特殊的树形数据结构,其中每个父节点的值都小于或大于其子节点的值,这使得最小(或最大)元素总是位于根节点。
**原理:**
`priority_queue`基于二叉堆(大顶堆或小顶堆,取决于底层存储类型),大顶堆的特点是父节点的值总是大于或等于子节点的值。当你从堆中删除顶部元素时,剩下的元素会自动调整为堆的性质,以便保持最小值(对于大顶堆)或最大值。
**接口:**
`priority_queue`的核心操作包括:
1. **构造函数:**`priority_queue`有两个主要版本:
- `priority_queue()`:默认使用`greater<T>`比较器,提供升序排列。
- `priority_queue(initializer_list<T>)` 或 `priority_queue(vector<T>)`:接受一个已排序的序列创建堆。
- `priority_queue(T*, size_t, Compare)`:接受指针、大小以及自定义比较器。
2. **插入/修改:**`push(element)`, `emplace(element)` 添加新的元素。
3. **删除/获取顶部元素:**`top() -> T &` 返回并移除最高优先级元素。
- 如果不需要移除,可以使用`peek()` 不改变堆。
4. **减少优先级:**`pop()` 移除并返回当前最高的元素。
5. **调整大小:**`size()` 返回元素数量,`empty()` 检查是否为空。
**使用示例:**
```cpp
#include <queue>
#include <iostream>
int main() {
std::priority_queue<int> pq; // 默认的大顶堆
pq.push(3);
pq.push(1);
pq.push(7);
while (!pq.empty()) {
std::cout << "Top element: " << pq.top() << '\n';
pq.pop(); // 最高优先级元素会被弹出
}
return 0;
}
```
在这个例子中,`3`、`1` 和 `7` 先后被添加到`priority_queue`,输出将是先打印`1`,然后是`3`,因为它们有更高的优先级。
阅读全文