簡體   English   中英

使用std :: greater

[英]Use of std::greater

我很好奇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> >創建最大堆。 可能反其道而行之。 為什么會這樣?

在cppreference引用std::priority_queue [強調我的]

優先級隊列是一個容器adaptor ,它以對數插入和提取為代價,提供最大(默認情況下)元素的常量時間查找。

可以提供用戶提供的Compare來更改排序, 例如使用std::greater<T>將導致最小元素顯示為top()

所以這個順序是預期的,並沒有真正涉及std::sort如何根據提供的二進制比較函數std::sort元素std::sort排序。

按升序[first, last)范圍內的元素進行排序。

...

參數

  • firstlast - 要排序的元素范圍

  • policy - 要使用的執行策略。 有關詳細信息,請參閱執

  • comp - 比較函數對象(即滿足Compare要求的對象) ,如果第first參數小於(即在之前排序) second參數,則返回true

由於std::greater如果第一個參數大於第二個參數將返回true ,我們期望在使用std::sortstd::greater作為執行比較的函數對象時,元素按降序std::sort


即, std::greater恰好是用於在示例的這兩個不同上下文中執行比較的函數對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM