2017-12-18 2 views
5

나는이 작업을 수행 할 수 :STL priority_queue + comparator를 특정 생성자와 함께 사용하는 방법은 무엇입니까?

#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의 요구 사항을 충족하지 않습니다. 당신은 front, push_backpop_back를 구현하고 Comparator의 인스턴스를 제공 할 수

4

RandomAccessIterator 그것을 구성 할 수 있습니다 iterator의를 가질 확인하고, vector 사용하거나 deque, 또는 자신의 SequenceContainer을 쓸 수 있습니다; 그렇지 않다면 Comparator()constructor of std::priority_queue의 기본 인수로 사용되지만 Comparator에는 기본 생성자가 없습니다. 예 : BTW

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

: std::setstd::priority_queue의 기본 컨테이너의 요구 사항을 충족하지 않습니다. 대신 std::vector 또는 std::deque을 사용할 수 있습니다.

요소를 저장하는 데 사용할 기본 컨테이너 유형입니다. 컨테이너는 SequenceContainer의 요구 사항을 충족해야하며 그 반복기는 RandomAccessIterator의 요구 사항을 충족해야합니다. 또한, 평소 의미론은 다음과 같은 기능을 제공해야 std::vectorstd::deque이 만족 표준 컨테이너

  • 전면()
  • 와 push_back()
  • 와 pop_back()

을 요구 사항.

+0

'priority_queue'는 어쨌든'set'보다 기능이 적습니다. 'priority_queue'를 선호하는 유일한 이유는 효율성입니다. –

관련 문제