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

为什么C++中priority_queue使用greater<>与sort使用greater<>的结果不同?

为什么sort用greater是降序,而priority_queue用greater是升序?

这确实是个容易让人困惑的点,核心原因在于**sort和priority_queue对比较器的定义逻辑完全相反**,咱们结合你的例子和greater的实现一步步理清楚:

先看sort的逻辑

sort的比较器comp(a, b)的作用是:判断a是否应该排在b的前面。

  • 默认用less<int>(),它的operator()返回a < b:意思是当a小于b时,a排在b前面,最终得到升序结果。
  • 当你用greater<int>()时,它的operator()返回a > b:意思是当a大于b时,a排在b前面,自然就得到了降序结果——这和你看到的运行结果一致。

再看priority_queue的逻辑

priority_queue的比较器comp(a, b)的作用是:判断a是否应该被放在b的优先级更低的位置(也就是b比a更靠近堆顶)。

  • 默认的priority_queue是大顶堆,用less<int>():当comp(a, b)返回a < b时,说明a的优先级比b低,b会被放在更上层,堆顶始终是最大的元素,所以弹出时是降序输出。
  • 当你用greater<int>()时,它的operator()返回a > b:意思是当a大于b时,a的优先级比b低,b会被放在更上层。这样堆顶就变成了最小的元素,弹出时自然是从小到大的升序结果——正好对应你代码里的运行结果。

结合greater的实现验证

你给出的greater实现是:

struct greater : public binary_function<_Tp, _Tp, bool> {
_GLIBCXX14_CONSTEXPR bool operator()(const _Tp& __x, const _Tp& __y) const {
return __x > __y;
}
}
  • 在sort中,调用greater()(x, y)返回x > y,就会把x放在y前面,大的元素先出现,降序。
  • 在priority_queue中,调用greater()(x, y)返回x > y,就会把x放到y的下方(优先级更低),小的元素留在堆顶,弹出时先出现小的,升序。

简单总结:sort的比较器管“谁在前”,priority_queue的比较器管“谁优先级低(谁在下面)”,两者的逻辑方向相反,才导致了相同的greater产生相反的排序结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 12:22:50