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问题等)。
  • 通过更改比较函数可实现最小堆或自定义优先级规则。
相关推荐
C++实习生3 分钟前
powerbuilder9.0中文版
c语言·c++
oioihoii43 分钟前
C++23 std::generator:用于范围的同步协程生成器 (P2502R2, P2787R0)
开发语言·c++·c++23
免檒44 分钟前
go基于redis+jwt进行用户认证和权限控制
开发语言·redis·golang
没有梦想的咸鱼185-1037-16631 小时前
全球森林数据如何分析?基于R语言森林生态系统结构、功能与稳定性分析与可视化
开发语言·随机森林·数据分析·r语言
Your易元1 小时前
设计模式-迭代器模式
java·开发语言
Cuit小唐1 小时前
C++ 迭代器模式详解
c++·算法·迭代器模式
2401_858286111 小时前
CD37.【C++ Dev】string类的模拟实现(上)
开发语言·c++·算法
╭⌒心岛初晴1 小时前
JAVA练习题(2) 找素数
java·开发语言·算法·java练习题·判断素数/质数
四谷夕雨1 小时前
C++八股 —— vector底层
开发语言·c++
零炻大礼包2 小时前
【MCP】服务端搭建(python和uv环境搭建、nodejs安装、pycharma安装)
开发语言·python·uv·mcp