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

C++中使用自定义比较器实现priority_queue降序排列

搞定按frequency从大到小排序的优先级队列

嘿,我来帮你修正这个C++优先级队列的排序逻辑!你现在的代码是按frequency从小到大排的(小顶堆),要改成从大到小的大顶堆,只需要调整自定义比较类的逻辑就行,下面给你详细说:

问题出在哪?

你原来的ComparisonClass里,operator()返回a->frequency - b->frequency,这会让频率小的Node优先级更高——因为C++的priority_queue会把比较器返回true的元素往后放。比如当a的频率比b小的时候,这个减法结果是负数,会被视为true,所以a就被排到b后面,最终队列是小的在前、大的在后,和你要的正好相反。

而且这里还有个小问题:返回int类型来做比较其实不太规范,C++的比较器应该返回bool类型,这样更安全也符合标准。

修正方案(推荐第一种)

方法1:用bool比较反转优先级(最规范)

把比较器改成判断a的频率是否小于b,这样频率大的Node会被优先放在队首。代码如下:

class Node { 
public: 
    char character; 
    int frequency; 
    Node *left, *right; 
}; 

class ComparisonClass { 
public: 
    // 核心修改:返回bool,当a的频率小于b时,a优先级更低,排后面
    bool operator()(Node *a, Node *b) { 
        return a->frequency < b->frequency; 
    } 
}; 

priority_queue<Node*, vector<Node*>, ComparisonClass> queue;

方法2:调整减法顺序(不推荐,有溢出风险)

如果你非要沿用原来的int返回方式,可以把减法顺序反过来,改成b->frequency - a->frequency,这样频率大的Node会让返回值为正/负,从而排在前面。但这种方式有整数溢出的风险(比如当频率值很大或者有负数时),所以不推荐:

class ComparisonClass { 
public: 
    int operator()(Node *a, Node *b) { 
        return b->frequency - a->frequency; 
    } 
}; 

验证你的示例

当你把A(20)、B(4)、C(6)、D(7)入队后,队首到队尾的顺序就是A → D → C → B,完全符合你的需求!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:27:02