如何原地反转std::priority_queue的堆序,实现逆序弹出打印?
解决思路与代码实现
要原地反转std::priority_queue的堆序,核心是利用它的底层容器和标准库堆算法,无需额外内存或修改原队列声明:
- 访问底层容器:
std::priority_queue的底层容器(默认是std::vector)属于保护成员,我们可以通过派生类合法访问它; - 原地重构堆:使用
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
相关产品推荐
相关产品推荐

