优先队列(priority_queue)详解
1. 基本概念
优先队列(Priority Queue)是一种特殊的队列数据结构,其中每个元素都有一个优先级,在优先队列中,元素的出队顺序由其优先级决定,优先级高的元素先出队,优先队列的实现通常基于堆(Heap)数据结构。
2. 常用操作
操作 | 描述 |
push | 将元素添加到队列尾部并进行排序 |
pop | 删除并返回队列中优先级最高的元素 |
top | 返回队列中优先级最高的元素,但不删除 |
empty | 检查队列是否为空 |
size | 返回队列中的元素个数 |
swap | 交换两个优先队列的内容 |
3. 声明与使用
优先队列可以通过包含头文件<queue>
来使用,以下是一些常见的声明方式:
默认大顶堆:
```cpp
#include <queue>
priority_queue<int> pq; // int 类型的大顶堆
```
小顶堆:
```cpp
#include <queue>
#include <vector>
#include <functional> // for greater<int>
priority_queue<int, vector<int>, greater<int>> pq; // int 类型的小顶堆
```
自定义类型:
```cpp
struct Node {
int x;
// 其他成员变量和方法
bool operator < (const Node &a) const {
return x < a.x; // 自定义比较规则
}
};
priority_queue<Node> pq; // 使用自定义类型和比较规则
```
4. 示例代码
以下是一个简单的使用优先队列的示例:
#include <iostream> #include <queue> #include <vector> #include <functional> using namespace std; int main() { // 创建一个大顶堆 priority_queue<int> maxHeap; maxHeap.push(10); maxHeap.push(8); maxHeap.push(12); maxHeap.push(14); maxHeap.push(6); while (!maxHeap.empty()) { cout << maxHeap.top() << " "; maxHeap.pop(); } cout << endl; // 输出:14 12 10 8 6 // 创建一个小顶堆 priority_queue<int, vector<int>, greater<int>> minHeap; minHeap.push(10); minHeap.push(8); minHeap.push(12); minHeap.push(14); minHeap.push(6); while (!minHeap.empty()) { cout << minHeap.top() << " "; minHeap.pop(); } cout << endl; // 输出:6 8 10 12 14 return 0; }
5. 注意事项
back()
操作,因为它是一个抽象的数据结构,不直接暴露底层容器的细节。
默认容器:如果没有指定容器类型,优先队列默认使用std::vector
作为其底层容器。
比较函数:可以通过模板参数指定比较函数,例如less<int>
(默认)或greater<int>
,以实现不同的排序规则。
仿函数:可以使用仿函数(Functor)或者Lambda表达式来定义自定义的比较规则。
各位小伙伴们,我刚刚为大家分享了有关priority_queue详解_详解的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!
本文来源于互联网,如若侵权,请联系管理员删除,本文链接:https://www.9969.net/68975.html