C++ 优先队列(priority_queue)深度解析
C++ 优先队列(priority_queue)深度解析
1. 什么是优先队列?
优先队列(Priority Queue) 是一种特殊的队列,它不遵循严格的先进先出(FIFO)原则,而是按照元素的优先级来出队。
生活中的比喻:
- 普通队列:像排队买票,先来先服务
- 优先队列:像医院急诊,病情严重的病人先得到治疗
2. 基本语法和定义
#include <queue>
#include <iostream>
using namespace std;// 基本定义方式
priority_queue<int> pq1; // 默认大顶堆
priority_queue<int, vector<int>, greater<int>> pq2; // 小顶堆
3. 三种常用的优先队列
3.1 大顶堆(默认)
#include <iostream>
#include <queue>
using namespace std;int main() {// 默认大顶堆:最大的元素在队首priority_queue<int> maxHeap;maxHeap.push(3);maxHeap.push(1);maxHeap.push(4);maxHeap.push(2);cout << "大顶堆元素出队顺序:";while (!maxHeap.empty()) {cout << maxHeap.top() << " "; // 输出:4 3 2 1maxHeap.pop();}cout << endl;return 0;
}
3.2 小顶堆
#include <iostream>
#include <queue>
#include <vector>
#include <functional> // 需要包含这个头文件
using namespace std;int main() {// 小顶堆:最小的元素在队首priority_queue<int, vector<int>, greater<int>> minHeap;minHeap.push(3);minHeap.push(1);minHeap.push(4);minHeap.push(2);cout << "小顶堆元素出队顺序:";while (!minHeap.empty()) {cout << minHeap.top() << " "; // 输出:1 2 3 4minHeap.pop();}cout << endl;return 0;
}
3.3 自定义优先级
#include <iostream>
#include <queue>
#include <vector>
using namespace std;// 自定义比较函数:按值的绝对值大小排序
struct AbsCompare {bool operator()(int a, int b) {return abs(a) < abs(