2017-12-18 3 views
5

Ich möchte, dies zu tun:Wie eine STL priority_queue + Komparator mit einem bestimmten Konstruktor verwenden?

#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 

Wie kann ich initialisieren diese Warteschlange Komparator mit der Referenz sofern es im Konstruktor braucht?

Antwort

1

Dies hat nichts mit Ihrem Comparator zu tun, und alles mit std::set zu tun, die nicht die Anforderungen von SequenceContainer erfüllen. Sie können vector oder deque, verwenden oder eigene SequenceContainer schreiben, um sicherzustellen, front, push_back und pop_back, zu implementieren und iterator s haben, die RandomAccessIterator

4

Sie eine Instanz von Comparator zur Verfügung stellen kann es zu konstruieren; Andernfalls wird Comparator() als Standardargument für constructor of std::priority_queue verwendet, aber Comparator hat keinen Standardkonstruktor. z.B.

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

BTW: std::set erfüllt nicht die Anforderung des zugrunde liegenden Behälter von std::priority_queue. Sie können stattdessen std::vector oder std::deque verwenden.

Der Typ des zugrunde liegenden Containers, der zum Speichern der Elemente verwendet wird. Der Container muss die Anforderungen von SequenceContainer erfüllen und seine Iteratoren müssen die Anforderungen von RandomAccessIterator erfüllen. Zusätzlich müssen sie folgende Funktionen mit den üblichen Semantik liefern:

  • Vorderseite()
  • push_back()
  • pop_back()

Die Standardcontainer std::vector und std::deque diese erfüllen Anforderungen.

+0

Eine 'priority_queue' hat sowieso weniger Funktionalität als ein' set'. Der einzige (aber möglicherweise sehr gute) Grund, Prioritätspriorität vorzuziehen, ist die Effizienz. –

Verwandte Themen