使用std :: greater

时间:2018-09-06 15:05:06

标签: 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;
}

以上代码的输出为:

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

1 个答案:

答案 0 :(得分:4)

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

  

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

     

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

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

  

升序排列[first, last) 范围内的元素   订单

     

...

     

参数

     
      
  • firstlast-要排序的元素范围

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

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

  •   

由于std::greater将返回true,如果它的第一个参数比第二个参数大<< / em>,我们期望在使用{{1}时,元素按降序排序},其中std::sort是用于执行比较的函数对象。


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