簡體   English   中英

優先級隊列如何在內部工作?

[英]c++ - Priority Queue - How does it work internally?

假設我有以下優先級隊列聲明:

    struct orderByRewards{

    bool operator() (pair<int,pair<int,int> > a, pair<int, pair<int, int> > b){
        return a.first < b.first;
    }
};

priority_queue<pair<int,pair<int,int> >, vector<pair<int,pair<int,int> > >, orderByRewards> Q;

我想知道是否有人可以花時間解釋我的編譯器如何解釋比較類。

  • 為什么需要重載()運算符?
  • 另外,在比較過程中使用()運算符在哪里?

感覺有點奇怪,尤其是因為我對模板和所有OOP概念都不是很滿意。

為什么我們需要聲明單個對象的類型和容器類型?

您不需要使operator()重載。 您可以聲明自定義方法:

typedef bool (*comp)(int,int);
bool compare(int a, int b)
{
   return (a<b);
}
int main()
{
    std::priority_queue<int,std::vector<int>, comp> pq(compare);
    return 0;
}

更新 :正如@WhozCraig指出的:可以在不重載operator()的情況下使用此對象,但是編譯器將面臨內聯operator()比較函數而不是運行時提供的解引用比較函數的更簡單情況。

您實際上是在詢問函數對象(或函子)。 函數對象是一個重載operator() 您可以將其當作函數來使用。 該標准提供了一些比較函子(例如您的orderByRewards )。 例如, std::less看起來像這樣:

template <class T>
struct less {
  constexpr bool operator()(const T &lhs, const T &rhs) const 
  {
    return lhs < rhs;
  }
};

如我們所見,重載的operator()僅使用<比較兩個參數,然后返回布爾結果。 要使用它,您需要創建一個std::less類型的對象,然后在其上使用函數調用語法:

std::less<int> compare;
assert(compare(5, 7) == true);

即使compare是一個對象,我們也可以像compare(5, 7)的函數一樣使用它。

現在我們知道您的類型orderByRewards是函數對象類型。 您將其作為std::priority_queue的模板類型參數傳遞。 然后,當需要比較隊列中的元素時, std::priority_queue的實現可以創建此比較函數對象的對象。

考慮一個更簡單的示例:

template <typename T, typename Comp>
struct foo {
  void bar(T a, T b) {
    Comp compare;
    if (compare(a, b)) {
      std::cout << "True" << std::endl;
    } else {
      std::cout << "False" << std::endl;
    }
  }
};

這是一個愚蠢的例子,但可以理解這一點。 我們可以這樣使用:

foo<int, std::less<int>> my_foo;
my_foo.bar(5, 7); // Will print true

我們可以通過傳遞foo任意比較函子類型來配置foo ,使其成員函數bar可以實例化和使用。

因此,以同樣的方式,通過為std::priority_queue提供一個比較函子類型來配置std::priority_queue ,它可用於對隊列中的元素進行排序。 這就是它確定元素之間優先級的方式。 實際上, std::priority_queue的默認模板類型參數是std::less

查看std::priority_queue的定義並從那里開始工作可能是最有意義的。

template <class T, class Container = vector<T>, 
          class Compare = less<typename Container::value_type> >
class priority_queue {

這表示Compare是某種類型,默認為std::less<T> ,因為T =基礎容器的value_type。 這彌補了您可能會有些瘋狂的事情(例如創建一種類型的priority_queue)但使基礎容器容納另一種類型的可能性的可能性(盡管並非偶然,但這種可能性不大)。

std::less依次定義如下:

template <class T> struct less {
    bool operator()(const T& x, const T& y) const;
    // plus a few typedefs for the argument and return types.
};

簡而言之,它是一種僅由一個公開可用的操作定義的類型: operator() ,可以傳遞要比較的兩個項目,並返回bool以指示第一個是否小於第二個。

因為那是什么std::priority_queue希望使用,無論您必須提供基本支持相同的函數調用的語法和語義(例如, operator()應采取const參數和本身應該是const修飾)。

暫無
暫無

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

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