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问题等)。
  • 通过更改比较函数可实现最小堆或自定义优先级规则。
相关推荐
Wang's Blog7 小时前
Java 项目实战: 交友项目 - FastDFS:入门案例
java·开发语言·交友
apcipot_rain8 小时前
C++转Java日记(03)
java·开发语言·c++
布莱克6058 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
xys_6788 小时前
深挖C++:类和对象(中)
开发语言·c++
灿飞屋8 小时前
Rust 编程其实很简单
开发语言·rust
MOONICK10 小时前
QT元数据
开发语言·qt
D e re k ZH11 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
灿飞屋12 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓
xiaoye-duck12 小时前
《C++ 项目:手写大模型接入 SDK》Ollama接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
zaizai100712 小时前
【Effective Modern C++】学习第一章
c++