C++中priority_queue默认为最大堆,基于vector和堆算法实现;最小堆需指定greater比较器;还可用make_heap等底层函数或手动实现堆结构。
在 C++ 中,priority_queue 是标准模板库(STL)提供的容器适配器,底层默认基于 最大堆(max-heap) 实现,使用 std::vector 作为存储结构,并通过 std::make_heap、std::push_heap、std::pop_heap 等算法维护堆性质。你可以直接使用它,也可以手动实现一个最小堆/最大堆来深入理解原理。
这是最常用、最安全的方式,适用于绝大多数场景:
top() 返回最大值)priority_queue, greater>
示例代码:
#include#include using namespace std; int main() { // 最大堆(默认) priority_queue maxQ; maxQ.push(3); maxQ.push(1); maxQ.push(4); cout << maxQ.top() << endl; // 输出 4 // 最小堆 priority_queue , greater > minQ; minQ.push(3); minQ.push(1); minQ.push(4); cout << minQ.top() << endl; // 输出 1 }
理解堆本质的关键是掌握「完全二叉树的数组表示」和「上浮(sift-up)/下沉(sift-down)」操作:
i 的节点,左子节点下标 = 2*i + 1,右子节点 = 2*i + 2,父节点 = (i-1)/2
简易最小堆实现(不带泛型,便于理解):
#include#include using namespace std; class MinHeap { vector heap; void siftDown(int i) { int n = heap.size(); while (true) { int smallest = i; int left = 2*i + 1, right = 2*i + 2; if (left < n && heap[left] < heap[smallest]) smallest = left; if (right < n && heap[right] < heap[smallest]) smallest = right; if (smallest == i) break; swap(heap[i], heap[smallest]); i = smallest; } } void siftUp(int i) { while (i > 0) { int parent = (i-1)/2; if (heap[i] >= heap[parent]) break; swap(heap[i], heap[parent]); i = parent; } } public: void push(int x) { heap.push_back(x); siftUp(heap.size()-1); } int top() { return heap.empt y() ? -1 : heap[0]; } void pop() { if (heap.empty()) return; heap[0] = heap.back(); heap.pop_back(); if (!heap.empty()) siftDown(0); } bool empty() { return heap.empty(); } };
C++ 提供了原始堆操作函数,可直接在 vector 或数组上构建/维护堆:
make_heap(first, last):将区间转为最大堆push_heap(first, last):把末尾元素加入已建好的堆(调用前需先 push_back)pop_heap(first, last):把堆顶移到末尾,剩余部分仍是堆(调用后需再 pop_back)greater() 作为比较器示例:
#include #include#include using namespace std; int main() { vector v = {3, 1, 4, 1, 5}; make_heap(v.begin(), v.end()); // 构建最大堆 cout << v[0] << endl; // 5 v.push_back(2); push_heap(v.begin(), v.end()); // 插入 2 并调整 cout << v[0] << endl; // 5 还是最大值 pop_heap(v.begin(), v.end()); // 5 移到末尾 v.pop_back(); // 真正删除 cout << v[0] << endl; // 新的最大值 }
初学堆容易踩坑,这些点值得留意:
priority_queue 不支持随机访问或遍历,不能像 vector 那样用下标取中间元素 运算符,或显式传入比较函数对象(如 greater> )
不复杂但容易忽略。
# go
# ai
# c++
# ios
# stream
# 排序算法
# 运算符
# int
# 数据结构
# 接口
# 堆
# 泛型
# 对象
# 算法
# 大堆
# 移到
# 这是
# 你可以
# 遍历
# 均为
# 适用于
# 仍是
# 弹出
# 自定义
相关文章:
建站之星如何配置系统实现高效建站?
如何生成腾讯云建站专用兑换码?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
Swift中循环语句中的转移语句 break 和 continue
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
免费视频制作网站,更新又快又好的免费电影网站?
linux top下的 minerd 木马清除方法
北京网站制作网页,网站升级改版需要多久?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
打鱼网站制作软件,波克捕鱼官方号怎么注册?
如何在腾讯云服务器快速搭建个人网站?
实例解析angularjs的filter过滤器
如何选择CMS系统实现快速建站与SEO优化?
潮流网站制作头像软件下载,适合母子的网名有哪些?
定制建站方案优化指南:企业官网开发与建站费用解析
如何通过老薛主机一键快速建站?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
建站主机功能解析:服务器选择与快速搭建指南
宝塔建站无法访问?如何排查配置与端口问题?
建站之星3.0如何解决常见操作问题?
定制建站是什么?如何实现个性化需求?
上海网站制作开发公司,上海买房比较好的网站有哪些?
广州营销型建站服务商推荐:技术优势与SEO优化解析
建站之星收费标准详解:套餐费用及年费价格表一览
建站168自助建站系统:快速模板定制与SEO优化指南
微信小程序 五星评分(包括半颗星评分)实例代码
如何在局域网内绑定自建网站域名?
制作证书网站有哪些,全国城建培训中心证书查询官网?
如何用西部建站助手快速创建专业网站?
网站代码制作软件有哪些,如何生成自己网站的代码?
如何在万网主机上快速搭建网站?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
如何快速完成中国万网建站详细流程?
如何在万网自助建站平台快速创建网站?
在线教育网站制作平台,山西立德教育官网?
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
建站之星代理平台如何选择最佳方案?
如何用IIS7快速搭建并优化网站站点?
制作电商网页,电商供应链怎么做?
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
建站之星云端配置指南:模板选择与SEO优化一键生成
建站之星如何实现五合一智能建站与营销推广?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
nginx修改上传文件大小限制的方法
ui设计制作网站有哪些,手机UI设计网址吗?
如何解决VPS建站LNMP环境配置常见问题?
浅谈Javascript中的Label语句
如何通过商城免费建站系统源码自定义网站主题?
*请认真填写需求信息,我们会在24小时内与您取得联系。