如何使用具有特定构造函数的STL priority_queue +比较器?

时间:2017-12-18 14:12:13

标签: c++ constructor priority-queue functor

我想这样做:

#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

我如何初始化此队列,为Comparator提供构造函数中所需的引用?

2 个答案:

答案 0 :(得分:6)

您可以提供Comparator的实例来构建它;否则Comparator()将被用作constructor of std::priority_queue的默认参数,但Comparator没有默认构造函数。 e.g。

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

BTW:std::set不满足std::priority_queue的基础容器的要求。您可以改为使用std::vectorstd::deque

  

用于存储元素的基础容器的类型。该   容器必须满足SequenceContainer及其要求   迭代器必须满足RandomAccessIterator的要求。   此外,它必须提供通常的以下功能   语义:

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

标准容器std::vectorstd::deque满足这些要求   要求。

答案 1 :(得分:1)

这与您的Comparator无关,而与std::set无关,无法满足SequenceContainer的要求。您可以使用vectordeque,也可以编写自己的SequenceContainer,确保实施frontpush_backpop_back,并{ {1}} iterator