2017-12-18 164 views
5

我想這樣做:如何在特定構造函數中使用STL priority_queue +比較器?

#include <queue> 
#include <set> 

class Comparator 
{ 
    public: 
    Comparator(SomeObject& rTool) : mrTools(rTool) {} 

    bool operator()(const std::string& a, const std::string& b) 
    { 
     return mrTools.doSomething(a,b); 
    } 

    private: 
    SomeObject& mrTools; 
} 

std::priority_queue<std::string, std::set<std::string>, Comparator> queue; 
//<- this doesn't compile 

我怎樣才能initalize這個隊列提供比較它在構造函數中所需要的參考?

回答

1

這與您的Comparator無關,以及與std::set不符合SequenceContainer要求的任何事情。您可以使用vectordeque,或者自己寫SequenceContainer,確保實現frontpush_backpop_back,並有iterator S中的RandomAccessIterator

4

您可以提供的Comparator實例,從而構建它;否則Comparator()將用作constructor of std::priority_queue的默認參數,但Comparator不具有默認構造函數。例如

SomeObject so; 
std::priority_queue<std::string, std::set<std::string>, Comparator> queue(Comparator(so)); 

順便說一句:std::set不滿足std::priority_queue底層容器的要求。您可以改用std::vectorstd::deque

用於存儲元素的底層容器的類型。容器必須滿足SequenceContainer的要求,其 迭代器必須滿足RandomAccessIterator的要求。 此外,它必須提供以下功能與通常的 語義:

  • 前()
  • 的push_back()
  • pop_back()

標準集裝箱std::vectorstd::deque滿足這些 要求。

+0

無論如何,'priority_queue'的功能比'set'少。唯一(但可能是非常好的)選擇'priority_queue'的原因是效率。 –

相關問題