优先队列介绍
priority_queue 是 C++ 标准模板库(STL)中的一个容器适配器,提供了堆数据结构的实现(默认为最大堆)。它在需要高效访问最大/最小元素的场景下非常有用!
如果需要使用小顶堆,可以这样传参
priority_queue<int, vector<int>, greater<int>>
它是默认基于(大顶)堆实现的,例如一颗用数组存储的完全二叉树。
特点总结:
- 采用数组形式存储
- 默认基于最大堆实现
- 适配器容器底层为 vector(使用需要包含
<queue>) - 每次只能访问队列顶部的元素,即优先级最高的元素
- 复杂度:访问 O(1)、插入 O(log n)、删除顶部元素 O(log n)
优先队列的渊源
我们通过 优先队列 的容器结构应该猜到,它的底层容器是 vector,为什么不取名叫优先维克托呢。
问:为什么底层容器是 vector? 连续内存结构适合堆的随机访问需求,缓存友好,且动态数组支持高效尾部操作。
问:为什么头文件是 queue? 作为容器适配器,优先队列在概念上属于队列的一种,与 queue 共用同一头文件,体现了接口的一致性,比如队列的各种接口刚好吻合它的访问、插入、删除行为。
问:为什么叫优先队列而不是优先维克托? 名称语义分解:
- 优先 (Priority):元素按内在重要性排序,而非插入顺序
- 队列 (Queue):仅允许特定端点访问的操作模型(队尾插入,队首访问)
行为本质:
- 插入操作:
push(),时间复杂度 O(log n) - 访问操作:
top(),总是获取优先级最高的元素 - 删除操作:
pop(),移除当前最高优先级元素
实例化
采用:priority_queue<数据类型> 变量名;
我们可以选择默认初始化:
priority_queue<int> V1;
也可以选择范围初始化:
priority_queue<int> V2(arr, arr+n); //或者用另一个容器去初始化 priority_queue<int> V3(V1.begin(),V1.end());
插入元素
V.push(val);
访问元素
遵循堆的性质,只能访问堆顶元素
V.top();
获取元素个数
V.size();
判断优先队列是否为空
V.empty();


