我对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> >
创建一个最大堆。反之亦然。为什么会这样?
答案 0 :(得分:4)
引用std::priority_queue
at cppreference [强调我的意思]
优先级队列是提供恒定时间的容器
adaptor
查找最大的元素(默认情况下),但代价是 对数插入和提取。可以提供用户提供的
Compare
来更改顺序,例如, 使用std::greater<T>
将导致最小的元素显示为top()
。
因此,此顺序是预期的,与std::sort
如何基于提供的二进制比较函数对元素进行排序无关。
升序排列
[first, last)
范围内的元素 订单。...
参数
first
,last
-要排序的元素范围
policy
-要使用的执行策略。有关详细信息,请参见执行策略。
comp
-比较函数对象(即满足以下条件的对象 比较的要求)如果参数true
返回first
小于second
(即在此之前订购)。
由于std::greater
将返回true
,如果它的第一个参数比第二个参数大<< / em>,我们期望在使用{{1}时,元素按降序排序},其中std::sort
是用于执行比较的函数对象。
即std::greater
恰好是在示例的这两个不同上下文中执行比较的函数对象。