【问题标题】:Use of std::greater使用 std::greater
【发布时间】: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&lt;int, std::vector&lt;int&gt;, std::greater&lt;int&gt; &gt; 创建一个最小堆,而std::priority_queue&lt;int, std::vector&lt;int&gt;, std::less&lt;int&gt; &gt; 创建一个最大堆。本来可以反过来。为什么会这样?

【问题讨论】:

  • 请解释否决票。理解 STL 中使用的结构的行为是一个有效的问题。
  • 在我看来,您实际上要问的问题是为什么std::sort 的排序与std::priority_queue 的顺序相反,并且与std::greater 无关。编辑:这不是对否决票的解释,我没有投反对票。
  • 仍然是一个相当好的问题:mcve + clear + specific + well formatted。
  • @FrançoisAndrieux:标题清楚地说明了我的问题。另外提供了干净的代码示例,以免产生歧义。我们只需要耐心阅读整个问题。
  • Greater 只是表示某事物是否大于另一个事物。它并不暗示与结果相关的任何特定行为。您可以使用它在任一方向进行排序。

标签: c++ priority-queue


【解决方案1】:

引用std::priority_queue at cppreference [强调我的]

优先级队列是提供恒定时间的容器adaptor 查找最大(默认)元素,代价是 对数插入和提取。

可以提供用户提供的Compare 来更改排序,例如 使用std::greater&lt;T&gt; 会导致最小元素显示为 top()

所以这个顺序是预期的,并且与std::sort 如何根据提供的二进制比较函数对元素进行排序没有真正的关系。

[first, last)范围内的元素进行升序排序 订购

...

参数

  • first, last - 要排序的元素范围

  • policy - 要使用的执行策略。有关详细信息,请参阅执行政策。

  • comp - 比较函数对象(即满足 比较的要求)如果first参数返回true 小于(即在之前订购)second

由于std::greater 将返回true,如果它的第一个参数大于它的第二个参数,我们希望在使用std::sortstd::greater 时元素按降序排列用于执行比较的函数对象。


即,std::greater 恰好是用于在示例的这两个不同上下文中执行比较的函数对象。

【讨论】:

  • 感谢您解释 sortpriority_queue 的行为差异。但是“或类似的行”之后的问题部分仍然没有得到回答。我的意思是问为什么不是“可以提供用户提供的比较来更改顺序,例如使用 std::**less** 会导致 smallest 元素显示为顶端()。”? &lt;functional&gt; less for min heap 比 greater 更有意义。对吗?
  • @ShridharRKulkarni 这确实是一个不同的(第二个)问题,并且该选择的基本原理(来自 C++ 标准)已经有an excellent answer here。我认为没有理由在我的答案中复制该内容,但我明天可以添加链接,因为我不只是通过手机访问 SO。
猜你喜欢
  • 2021-10-29
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 2019-11-16
  • 2013-05-10
  • 2018-09-18
相关资源
最近更新 更多