C++ priority_queue 堆

1. ​基本概念

  • 定义std::priority_queue 是一个容器适配器,提供基于优先级的元素访问(默认最大堆,即队首为最大元素)。
  • 头文件#include <queue>
  • 底层容器 :默认使用 std::vector(可替换为 std::deque)。
  • 特性
    • 元素按优先级顺序出队。
    • 插入元素的时间复杂度为 O(log n),获取队首元素的时间复杂度为 O(1)。
    • 不支持随机访问或遍历操作。

2. ​构造函数

(1) ​默认构造函数
cpp 复制代码
std::priority_queue<int> pq1;  // 默认底层容器为vector,比较函数为less(最大堆)
(2) ​指定底层容器和比较函数
cpp 复制代码
// 使用deque作为底层容器,比较函数为greater(最小堆)
std::priority_queue<int, std::deque<int>, std::greater<int>> pq2;
//因为缺省值规则的问题,所以我们必须写出底层容器才能指明建小堆
(3) ​通过迭代器范围构造
cpp 复制代码
int arr[] = {3, 1, 4, 1, 5};
std::priority_queue<int> pq3(arr, arr + 5);  // 插入数组元素并建堆 → {5, 4, 3, 1, 1}
(4) ​通过已有容器构造
cpp 复制代码
std::vector<int> vec = {5, 3, 8};
std::priority_queue<int> pq4(vec.begin(), vec.end());  // 堆化为 {8, 5, 3}

3. ​核心成员函数

(1) ​push()

插入元素并调整堆结构:

cpp 复制代码
pq1.push(10);  // 插入10,堆结构自动调整
(2) ​pop()

移除队首元素(优先级最高的元素):

cpp 复制代码
pq1.pop();  // 移除当前队首元素
(3) ​top()

返回队首元素的常量引用(不可修改):

cpp 复制代码
int max_val = pq1.top();  // 获取当前最大元素
(4) ​empty()

判断优先级队列是否为空:

cpp 复制代码
if (pq1.empty()) { /* 处理空队列 */ }
(5) ​size()

返回队列中元素数量:

cpp 复制代码
size_t count = pq1.size();  // 当前元素个数

4. ​底层容器与比较函数

1.底层容器要求
  • 必须支持 front()push_back()pop_back() 和随机访问迭代器。
  • 默认使用 std::vector,但允许替换为 std::deque(不可用 std::list)。

5. ​注意事项

  1. 没有 clear() 方法

    • 清空队列需手动循环 pop()
  2. 不可修改队首元素

    • top() 返回常量引用,直接修改队首元素会破坏堆结构。

总结

  • std::priority_queue 适用于需要按优先级处理元素的场景(如任务调度、贪心算法、TopK问题等)。
  • 通过更改比较函数可实现最小堆或自定义优先级规则。
相关推荐
编程见习者10 分钟前
OpenCV的详细介绍与安装(一)
c++·人工智能·opencv·计算机视觉
邪恶的贝利亚13 分钟前
C++ 基础深入剖析:编译、内存与面向对象编程要点解析
开发语言·c++
ChoSeitaku20 分钟前
NO.93十六届蓝桥杯备战|图论基础-拓扑排序|有向无环图|AOV网|摄像头|最大食物链计数|杂物(C++)
c++·蓝桥杯·图论
Dream it possible!20 分钟前
CCF CSP 第36次(2024.12)(1_移动_C++)
c++·ccf csp·csp
陳長生.26 分钟前
JAVA EE_初始网络原理
java·开发语言·网络·java-ee
T - mars32 分钟前
常见的爬虫算法
开发语言·javascript·ecmascript
HackerKevn1 小时前
【项目】构建高性能多线程内存池:简化版 tcmalloc 实现指南
c++·高并发内存池·tcmalloc·池化技术
会飞的土拨鼠呀1 小时前
SP B\nRebuild Priorit> 如何用python去掉\n
开发语言·windows·python
珊瑚里的鱼1 小时前
【双指针】专题:LeetCode 202题解——快乐数
开发语言·c++·笔记·算法·leetcode·职场和发展
王磊鑫1 小时前
重返JAVA之路——图书管理系统
java·开发语言