geeksforgeeks - declarando una prioridad_cinta en c++ con un comparador personalizado
priority queue default order c++ (4)
Debe declarar un operator()
Compare
y sobrecarga de clase operator()
para esto de la siguiente manera:
class Foo
{
};
class Compare
{
public:
bool operator() (Foo, Foo)
{
return true;
}
};
int main()
{
std::priority_queue<Foo, std::vector<Foo>, Compare> pq;
return 0;
}
O, si por alguna razón no puedes hacerlo como clase, podrías usar std::function
para ello:
class Foo
{
};
bool Compare(Foo, Foo)
{
return true;
}
int main()
{
std::priority_queue<Foo, std::vector<Foo>, std::function<bool(Foo, Foo)>> pq(Compare);
return 0;
}
Estoy tratando de declarar una priority_queue of nodes
, utilizando bool Compare(Node a, Node b)
como la 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, recibo un Error: "Compare" is not a type name
Cambio de la declaración a priority_queue <Node, vector<Node>, bool Compare>
me da Error: expected a ''>''
También he intentado:
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
?
El tercer parámetro de la plantilla debe ser una clase que tenga el operator()(Node,Node)
sobrecargado. Así que tendrás que crear una clase de esta manera:
class ComparisonClass {
bool operator() (Node, Node) {
//comparison code here
}
};
Y luego usarás esta clase como el tercer parámetro de la plantilla como este:
priority_queue<Node, vector<Node>, ComparisonClass> q;
La respuesta aceptada le hace creer que debe usar una clase o una std::function
como comparador. ¡Esto no es verdad! La respuesta de cute_ptr mostró cómo pasar una función al constructor, pero hay una forma más simple:
priority_queue<Node, vector<Node>, decltype(&Compare)> openSet(Compare);
Es decir, no es necesario codificar explícitamente el tipo de función, puede dejar que el compilador haga eso por usted.
Respondiendo su pregunta directamente:
Estoy tratando de declarar una
priority_queue
de cola de nodos, utilizandobool Compare(Node a, Node b) as the comparator function
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
El compilador le está diciendo exactamente lo que está mal: Compare
no es un nombre de tipo, sino una instancia de una función que toma dos Nodes
y devuelve un valor bool
.
Lo que necesitas es especificar el tipo de puntero de función:
std::priority_queue<Node, std::vector<Node>, bool (*)(Node, Node)> openSet(Compare)