2017-12-18 393 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'的原因是效率。 –