使用std :: greater

Shr*_*rni 4 c++ priority-queue

我对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;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码输出为:

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> >创建一个最大堆。反之亦然。为什么会这样呢?

dfr*_*fri 5

引用std::priority_queuecppreference [强调我的]

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

Compare可以提供用户提供的更改顺序,例如使用std::greater<T>会导致最小的元素显示为top()。

因此,该顺序是预期的,并且与std::sort基于提供的二进制比较函数对元素进行排序的方式无关。

对范围内的元素[first, last) 按升序排序。

...

参量

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

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

  • comp-比较函数对象(即满足Compare要求的对象),true如果first参数小于(即在之前排序),则返回second。

正如std::greater将返回true如果它的第一个参数是大于它的第二个,我们预期使用当元件以降序进行排序std::sort以std::greater作为功能对象用于执行比较。


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