dichiarando un priority_queue in c ++ con un comparatore personalizzato

Sto cercando di dichiarare un priority_queue of nodes , usando bool Compare(Node a, Node b) come funzione di confronto (che è al di fuori della class del nodo).

Quello che attualmente ho è:

 priority_queue<Node, vector, Compare> openSet; 

Per qualche motivo, sto ricevendo Error: "Compare" is not a type name

Modifica della dichiarazione su priority_queue <Node, vector, bool Compare>

mi dà Error: expected a '>'

Ho anche provato:

 priority_queue<Node, vector, Compare()> openSet; priority_queue<Node, vector, bool Compare()> openSet; priority_queue<Node, vector, Compare> openSet; 

Come dovrei dichiarare correttamente il mio priority_queue ?

Dovresti dichiarare una class Compare e overload operator() per questo in questo modo:

 class Foo { }; class Compare { public: bool operator() (Foo, Foo) { return true; } }; int main() { std::priority_queue, Compare> pq; return 0; } 

Oppure, se per qualche motivo non puoi renderlo come class, potresti usare std::function per questo:

 class Foo { }; bool Compare(Foo, Foo) { return true; } int main() { std::priority_queue, std::function> pq(Compare); return 0; } 

Il terzo parametro template deve essere una class che ha overload operator()(Node,Node) . Quindi dovrai creare una class in questo modo:

 class ComparisonClass { bool operator() (Node, Node) { //comparison code here } }; 

E quindi userete questa class come il terzo parametro template come questo:

 priority_queue, ComparisonClass> q; 

Rispondere direttamente alla tua domanda:

Sto cercando di dichiarare un priority_queue di nodes, usando bool Compare(Node a, Node b) as the comparator function

Quello che attualmente ho è:

 priority_queue, Compare> openSet; 

Per qualche motivo, sto ricevendo errore:

 "Compare" is not a type name 

Il compilatore ti sta dicendo esattamente cosa c’è che non va: Compare non è un nome di tipo, ma un’istanza di una funzione che prende due Nodes e restituisce un bool .
Quello di cui hai bisogno è specificare il tipo di puntatore della funzione:
std::priority_queue, bool (*)(Node, Node)> openSet(Compare)

La risposta accettata ti fa credere che devi usare una class o una std::function come comparatore. Questo non è vero! La risposta di nice_ptr ha mostrato come passare una funzione al costruttore, ma c’è un modo più semplice:

 priority_queue, decltype(&Compare)> openSet(Compare); 

Cioè, non c’è bisogno di codificare esplicitamente il tipo di funzione, puoi lasciare che sia il compilatore a farlo per te.