为什么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
相关产品推荐
相关产品推荐

