【发布时间】:2019-02-11 21:30:54
【问题描述】:
我很好奇std::greater 的用法。
当与sort 一起使用时,它会按降序输出数字。但与priority_queue 一起使用时,数字按升序输出。为什么会这样?
例子:
#include <iostream> // std::cout
#include <functional> // std::greater
#include <algorithm> // std::sort
#include <queue> // std::priority_queue
int main () {
int numbers[]={20,40,50,10,30};
std::priority_queue<int, std::vector<int>, std::greater<int>> pq (numbers, numbers+5);
std::sort(numbers, numbers + 5, std::greater<int>());
while(!pq.empty()){
std:: cout << pq.top() << ' ';
pq.pop();
}
std::cout << '\n';
for (int i=0; i<5; i++)
std::cout << numbers[i] << ' ';
return 0;
}
上面代码的输出是:
10 20 30 40 50
50 40 30 20 10
或类似的行,
std::priority_queue<int, std::vector<int>, std::greater<int> > 创建一个最小堆,而std::priority_queue<int, std::vector<int>, std::less<int> > 创建一个最大堆。本来可以反过来。为什么会这样?
【问题讨论】:
-
请解释否决票。理解 STL 中使用的结构的行为是一个有效的问题。
-
在我看来,您实际上要问的问题是为什么
std::sort的排序与std::priority_queue的顺序相反,并且与std::greater无关。编辑:这不是对否决票的解释,我没有投反对票。 -
仍然是一个相当好的问题:mcve + clear + specific + well formatted。
-
@FrançoisAndrieux:标题清楚地说明了我的问题。另外提供了干净的代码示例,以免产生歧义。我们只需要耐心阅读整个问题。
-
Greater 只是表示某事物是否大于另一个事物。它并不暗示与结果相关的任何特定行为。您可以使用它在任一方向进行排序。
标签: c++ priority-queue