You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何原地反转std::priority_queue的堆序,实现逆序弹出打印?

解决思路与代码实现

要原地反转std::priority_queue的堆序,核心是利用它的底层容器和标准库堆算法,无需额外内存或修改原队列声明:

  1. 访问底层容器:std::priority_queue的底层容器(默认是std::vector)属于保护成员,我们可以通过派生类合法访问它;
  2. 原地重构堆:使用std::make_heap算法,传入反向的比较函数(原默认是std::less<T>,改用std::greater<T>),将原最大堆转换为最小堆,实现堆序反转。

完整代码示例

#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>

// 辅助类:用于访问priority_queue的保护成员底层容器c
template<typename T>
struct AccessPQ : public std::priority_queue<T> {
    using std::priority_queue<T>::c;
};

int main() {
    std::priority_queue<int> pq{};
    pq.push(1);
    pq.push(2);
    pq.push(3);

    // 原地反转堆序
    AccessPQ<int>& access_pq = static_cast<AccessPQ<int>&>(pq);
    std::make_heap(access_pq.c.begin(), access_pq.c.end(), std::greater<int>());

    // 此时弹出元素会按升序打印123
    while(!pq.empty()){
        std::cout << pq.top();
        pq.pop();
    }

    return 0;
}

原理说明

  • AccessPQ类继承自std::priority_queue,通过using声明暴露保护成员c,让我们能直接操作底层容器;
  • std::make_heap是原地算法,直接修改容器内元素的排列,将其重构为以std::greater<int>为比较规则的最小堆,刚好反转原队列的最大堆顺序;
  • 整个过程没有额外内存分配,也没有修改原priority_queue的声明,完全符合需求。

内容的提问来源于stack exchange,提问作者John_Cena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 05:04:59