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问题等)。
  • 通过更改比较函数可实现最小堆或自定义优先级规则。
相关推荐
Qiang_san13 分钟前
GNU Make | C/C++项目自动构建入门
c语言·c++·gnu
小红帽2.033 分钟前
从零构建一款开源在线客服系统:我的Go语言实战之旅
开发语言·golang·开源
slim~35 分钟前
Java基础第9天总结(可变参数、Collections、斗地主)
java·开发语言
源代码•宸44 分钟前
Leetcode—2749. 得到整数零需要执行的最少操作数【中等】(__builtin_popcountl)
c++·经验分享·算法·leetcode·位运算
芒果敲代码1 小时前
单一职责原则(SRP)
c++·单一职责原则
ComputerInBook1 小时前
C++编程语言:标准库:第37章——正则表达式(Bjarne Stroustrup)
开发语言·c++·正则表达式
青草地溪水旁2 小时前
C/C++中的可变参数 (Variadic Arguments)函数机制
c语言·c++·可变参数
A尘埃2 小时前
智能工单路由系统(Java)
java·开发语言·智能工单
汉克老师2 小时前
第十四届蓝桥杯青少组C++选拔赛[2023.2.12]第二部分编程题(1、求和)
c++·蓝桥杯·蓝桥杯c++·c++蓝桥杯
Source.Liu2 小时前
【Python基础】 13 Rust 与 Python 注释对比笔记
开发语言·笔记·python·rust