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问题等)。
  • 通过更改比较函数可实现最小堆或自定义优先级规则。
相关推荐
今晚打老虎17 分钟前
c++之提高A(前缀和)(第三课)
数据结构·c++·算法
狗凯之家源码网22 分钟前
微博图床 PHP 系统搭建与实战应用指南
android·开发语言·php
by209992 小时前
从结构体到对象:正式学习C++类的骨架、封装与this指针
c++·经验分享·学习
乌暮2 小时前
深入理解 Java 泛型:把「万能盒子」用对、用稳
java·开发语言·后端·学习
2601_962218612 小时前
C语言中三种库的编译和使用方法
开发语言·c++
传奇开心果编程3 小时前
中庸、有容、破执:仓颉编程语言的中华智慧结晶——三重哲学境界思辨
开发语言·华为·开源·软件工程
jimy13 小时前
派生类重写基类虚函数(二):override的作用
开发语言·c++
_upupup3 小时前
异常(C++)
java·开发语言·jvm
ebiobiz3 小时前
基于 GD32 Embedded Builder (GEB) 与 Nimmake 的 MCU 工程搭建指南
c++·python·单片机·嵌入式硬件·mcu
hetao17338373 小时前
2026-09-29 hetao1733837 的刷题记录
c++·算法