Ich versuche, a zu deklarieren priority_queue of nodes
und bool Compare(Node a, Node b)
als Komparatorfunktion zu verwenden (die außerhalb der Knotenklasse liegt).
Was ich derzeit habe, ist:
priority_queue<Node, vector<Node>, Compare> openSet;
Aus irgendeinem Grund bekomme ich Error: "Compare" is not a type name
Ändern der Deklaration in priority_queue <Node, vector<Node>, bool Compare>
gibt mir Error: expected a '>'
Ich habe auch versucht:
priority_queue<Node, vector<Node>, Compare()> openSet;
priority_queue<Node, vector<Node>, bool Compare()> openSet;
priority_queue<Node, vector<Node>, Compare<Node, Node>> openSet;
Wie soll ich meine richtig deklarieren priority_queue
?
c++
std
priority-queue
Steven Morad
quelle
quelle
operator()
, es sieht einfacher aus.pritority_queue
. Es ist jedoch möglich, denoperator<
eingebautenstd::less
Komparator zu überladen und zu verwenden , derbool Compare(Node a, Node b)
außerhalb der Klasse deklariert istNode
.Die akzeptierte Antwort lässt Sie glauben, dass Sie eine Klasse oder eine verwenden müssen
std::function
als Vergleich verwenden müssen. Das ist nicht wahr! Wie die Antwort von cute_ptr zeigt, können Sie dem Konstruktor einen Funktionszeiger übergeben. Die Syntax dafür ist jedoch viel einfacher als dort gezeigt:class Node; bool Compare(Node a, Node b); std::priority_queue<Node, std::vector<Node>, decltype(&Compare)> openSet(Compare);
Das heißt, es ist nicht erforderlich, den Funktionstyp explizit zu codieren. Sie können dies vom Compiler für Sie tun lassen
decltype
.Dies ist sehr nützlich, wenn der Komparator ein Lambda ist. Sie können den Typ eines Lambda nur auf andere Weise als mit angeben
decltype
. Zum Beispiel:auto compare = [](Node a, Node b) { return a.foo < b.foo; } std::priority_queue<Node, std::vector<Node>, decltype(compare)> openSet(compare);
quelle
Compare
ist es ein Lambda, für das es unmöglich ist, eine Erklärung zu schreiben), ich kenne keine Fallen.f
vorher und ersetzen Sie dannCompare
mitf
?Compare
kann dort eine Lambda-Funktion sein, wie inauto Compare = [](){};
. Aber Sie müssen verwendendecltype(Compare)
, anstattdecltype(&Compare)
.Der dritte Vorlagenparameter muss eine
operator()(Node,Node)
überladene Klasse sein . Sie müssen also eine Klasse wie folgt erstellen:class ComparisonClass { bool operator() (Node, Node) { //comparison code here } };
Und dann verwenden Sie diese Klasse als dritten Vorlagenparameter wie folgt:
priority_queue<Node, vector<Node>, ComparisonClass> q;
quelle
Beantworten Sie Ihre Frage direkt:
Der Compiler sagt Ihnen genau, was falsch ist: Es
Compare
handelt sich nicht um einen Typnamen, sondern um eine Instanz einer Funktion, die zwei verwendetNodes
und a zurückgibtbool
.Sie müssen lediglich den Funktionszeigertyp angeben:
std::priority_queue<Node, std::vector<Node>, bool (*)(Node, Node)> openSet(Compare)
quelle
Man kann auch eine Lambda-Funktion verwenden.
auto Compare = [](Node &a, Node &b) { //compare }; std::priority_queue<Node, std::vector<Node>, decltype(Compare)> openset(Compare);
quelle
Falls dies jemandem hilft:
static bool myFunction(Node& p1, Node& p2) {} priority_queue <Node, vector<Node>, function<bool(Node&, Node&)>> pq1(myFunction);
quelle
Sie müssen zuerst den Vergleich definieren. Dafür gibt es drei Möglichkeiten:
Es ist einfach, class / struct zu verwenden, da es einfach zu deklarieren ist, schreiben Sie einfach diese Codezeile über Ihren ausführenden Code
struct compare{ public: bool operator()(Node& a,Node& b) // overloading both operators { return a.w < b.w: // if you want increasing order;(i.e increasing for minPQ) return a.w > b.w // if you want reverse of default order;(i.e decreasing for minPQ) } };
Aufrufcode:
priority_queue<Node,vector<Node>,compare> pq;
quelle
bevorzuge struct und es ist das, was std :: Greater macht
struct Compare { bool operator()(Node const&, Node &) {} }
quelle