为何C++中priority_queue用greater<>实现升序,sort用其实现降序?
为什么C++ STL中sort和priority_queue使用greater<>的行为相反?
这个差异的核心原因是:sort和priority_queue对比较器的语义定义完全不同,前者用比较器直接指定排序后的元素顺序,后者用比较器定义堆结构的优先级判断规则。
1. sort的逻辑
sort的第三个参数是排序的顺序规则,它的作用是判断「两个元素a和b,是否应该让a排在b的前面」:
- 默认的
less<>()表示:如果a < b为真,就把a放在b前面,最终得到升序序列。 - 当传入
greater<>()时,规则变为:如果a > b为真,就把a放在b前面,所以最终元素从大到小排列,也就是降序。
简单说,sort的比较器直接定义了「前序元素和后序元素的大小关系」,greater<>()直接要求前面的元素比后面的大,自然输出降序结果。
2. priority_queue的逻辑
priority_queue的第三个参数是底层堆结构的维护规则,它的作用是判断「父节点和子节点的优先级高低,是否需要交换位置」:
- 默认的
less<>()用来构建大顶堆:如果parent < child为真,说明子节点优先级更高,需要交换,最终堆顶是最大元素,弹出时是从大到小的顺序(降序)。 - 当传入
greater<>()时,规则变为:如果parent > child为真,说明子节点优先级更高,需要交换,最终堆顶是最小元素,弹出时是从小到大的顺序(升序)。
本质上,priority_queue的比较器是用来确定「哪个元素应该被放在堆的下层」,greater<>()会让较小的元素留在堆顶,所以弹出时呈现升序。
代码示例
// sort使用greater<>实现降序排序 #include <vector> #include <algorithm> using namespace std; vector<int> temp = {3, 1, 4, 1, 5}; sort(temp.begin(), temp.end(), greater<>()); // temp的结果:{5, 4, 3, 1, 1}
// priority_queue使用greater<>实现升序弹出(小顶堆) #include <queue> #include <vector> using namespace std; priority_queue<int, vector<int>, greater<int>> pq; pq.push(3); pq.push(1); pq.push(4); // 弹出顺序:1 → 3 → 4
内容的提问来源于stack exchange,提问作者hambutter
相关产品推荐
相关产品推荐

