Estoy tratando de declarar a priority_queue of nodes
, usando bool Compare(Node a, Node b)
como función de comparación (que está fuera de la clase de nodo).
Lo que tengo actualmente es:
priority_queue<Node, vector<Node>, Compare> openSet;
Por alguna razón, estoy recibiendo Error: "Compare" is not a type name
Cambiar la declaración a priority_queue <Node, vector<Node>, bool Compare>
me da Error: expected a '>'
También he probado:
priority_queue<Node, vector<Node>, Compare()> openSet;
priority_queue<Node, vector<Node>, bool Compare()> openSet;
priority_queue<Node, vector<Node>, Compare<Node, Node>> openSet;
¿Cómo debo declarar correctamente mi priority_queue
?
c++
std
priority-queue
Steven Morad
fuente
fuente
operator()
, parece más simple.pritority_queue
. Es posible sobrecargaroperator<
y usar elstd::less
comparador incorporado , sin embargo, elbool Compare(Node a, Node b)
declarado fuera de la claseNode
, según la pregunta.La respuesta aceptada te hace creer que debes usar una clase o un
std::function
comparador. ¡Esto no es verdad! Como muestra la respuesta de cute_ptr , puede pasar un puntero de función al constructor. Sin embargo, la sintaxis para hacerlo es mucho más simple de lo que se muestra allí:class Node; bool Compare(Node a, Node b); std::priority_queue<Node, std::vector<Node>, decltype(&Compare)> openSet(Compare);
Es decir, no es necesario codificar explícitamente el tipo de función, puede dejar que el compilador lo haga por usted usando
decltype
.Esto es muy útil si el comparador es un lambda. No puede especificar el tipo de lambda de otra forma que no sea usando
decltype
. Por ejemplo:auto compare = [](Node a, Node b) { return a.foo < b.foo; } std::priority_queue<Node, std::vector<Node>, decltype(compare)> openSet(compare);
fuente
Compare
es una lambda, para la cual es imposible escribir una declaración), no conozco ninguna trampa.f
antemano y luego lo reemplazaríaCompare
conf
?Compare
puede haber una función lambda allí, como enauto Compare = [](){};
. Pero necesitas usardecltype(Compare)
, en lugar dedecltype(&Compare)
.El tercer parámetro de plantilla debe ser una clase que se haya
operator()(Node,Node)
sobrecargado. Entonces tendrás que crear una clase de esta manera:class ComparisonClass { bool operator() (Node, Node) { //comparison code here } };
Y luego usará esta clase como el tercer parámetro de plantilla como este:
priority_queue<Node, vector<Node>, ComparisonClass> q;
fuente
Respondiendo su pregunta directamente:
El compilador le dice exactamente qué está mal:
Compare
no es un nombre de tipo, sino una instancia de una función que toma dosNodes
y devuelve unbool
.Lo que necesita es especificar el tipo de puntero de función:
std::priority_queue<Node, std::vector<Node>, bool (*)(Node, Node)> openSet(Compare)
fuente
También se puede utilizar una función lambda.
auto Compare = [](Node &a, Node &b) { //compare }; std::priority_queue<Node, std::vector<Node>, decltype(Compare)> openset(Compare);
fuente
En caso de que esto ayude a alguien:
static bool myFunction(Node& p1, Node& p2) {} priority_queue <Node, vector<Node>, function<bool(Node&, Node&)>> pq1(myFunction);
fuente
Primero tienes que definir la comparación. Hay 3 formas de hacerlo:
Es fácil de usar class / struct porque es fácil de declarar, simplemente escriba esta línea de código sobre su código de ejecución
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) } };
Código de llamada:
priority_queue<Node,vector<Node>,compare> pq;
fuente
prefiero estructura, y es lo que std :: mayor hace
struct Compare { bool operator()(Node const&, Node &) {} }
fuente