当前位置: 首页 > news >正文

STL优先级队列的比较函数与大堆小堆的关系

STL中的priority_queue(优先级队列)通过比较函数来确定元素的优先级顺序,从而决定其内部是形成大堆还是小堆。以下是关键点总结:

  1. 默认行为与大堆

    • 默认情况下,priority_queue使用std::less<T>作为比较函数,形成大堆(最大堆)。
    • 大堆特性:父节点的值总大于或等于子节点,堆顶元素为最大值。
    • 比较逻辑:当a < b返回true时,认为b的优先级更高,较大的元素会被置于堆顶。
  2. 小堆的实现

    • 若使用std::greater<T>作为比较函数,则形成小堆(最小堆)。
    • 小堆特性:父节点的值总小于或等于子节点,堆顶元素为最小值。
    • 比较逻辑:当a > b返回true时,认为b的优先级更高,较小的元素会被置于堆顶。
  3. 比较函数的作用

    • 比较函数Compare接受两个参数ab,返回值为true表示第二个参数b的优先级更高
    • 元素的插入和堆调整均基于此规则,确保堆结构始终符合比较函数定义的顺序。
  4. 示例说明

    // 默认大堆,使用less<T>
    priority_queue<int> max_heap;// 显式小堆,使用greater<T>
    priority_queue<int, vector<int>, greater<int>> min_heap;
    
  5. 自定义比较函数

    • 可通过自定义函数或仿函数定义特殊优先级规则。例如,实现按绝对值大小排列的堆:
    struct AbsCompare {bool operator()(int a, int b) {return abs(a) < abs(b); // 返回true时,b的绝对值更大,优先级更高}
    };
    priority_queue<int, vector<int>, AbsCompare> abs_max_heap;
    

总结:比较函数通过定义元素的优先级顺序(第二个参数是否应优先于第一个参数),直接决定priority_queue是大堆还是小堆。理解比较函数参数的顺序及其返回值对优先级的影响,是正确使用优先级队列的关键。

相关文章:

  • I.MX6ULL裸机的EPIT实验
  • 贪心,回溯,动态规划
  • 从零发布一个 Vue 3 Button 组件到 npm(基于 Vite)
  • 更改安卓虚拟机屏幕大小
  • 计算机基础知识(第四篇)
  • 2025年上海市“星光计划”第十一届职业院校技能大赛 网络安全赛项技能操作模块样题
  • 农田水利如何「聪明」起来?Modbus转Ethernet IP破解设备互联
  • 洛谷题目:P2761 软件补丁问题 (本题简单)
  • linux下覆盖率测试总结
  • App使用webview套壳引入h5(二)—— app内访问h5,顶部被手机顶部菜单遮挡问题,保留顶部安全距离
  • 从Copilot到Agent,AI Coding是如何进化的?
  • [特殊字符] 一文了解目前主流的 Cursor AI 免费续杯工具!
  • 使用logrotate切割nginx日志
  • NX985NX988美光固态闪存NY103NY106
  • 【论文解读】MemGPT: 迈向为操作系统的LLM
  • 【如何做好应用架构?】
  • 基于WSL搭建Ubnutu 20.04.6 LTS(二)-部署Docker环境
  • 【强化学习】——03 Model-Free RL
  • 【前端】js如何处理计算精度问题
  • 并发编程 - go版