pseudocodigo programa prioridades prioridad pilas estatica elementos dev con colas cola c++ priority-queue

programa - pilas y colas en c++



ComparaciĆ³n de la cola de prioridad (6)

El parámetro de la plantilla debe ser el tipo de la función de comparación. La función se construye por defecto o se pasa una función en el constructor de priority_queue . Así que prueba cualquiera

std::priority_queue<int, std::vector<int>, decltype(&compare)> pq(&compare);

o no use punteros de función, sino un funtor de la biblioteca estándar que luego puede construirse por defecto, eliminando la necesidad de pasar una instancia en el constructor:

std::priority_queue<int, std::vector<int>, std::less<int> > pq;

http://ideone.com/KDOkJf

Si su función de comparación no se puede expresar utilizando los funtores de biblioteca estándar (en caso de que use clases personalizadas en la cola de prioridad), le recomiendo que escriba una clase de functor personalizado o use una lambda .

Estoy intentando declarar una cola de prioridad en c ++ usando una función de comparación personalizada ...

Por lo tanto, declaro la cola de la siguiente manera:

std::priority_queue<int,std::vector<int>, compare> pq;

y aquí está la función de comparación:

bool compare(int a, int b) { return (a<b); }

Estoy bastante seguro de que hice esto antes, sin una clase, de una manera similar, pero ahora, este código no se compila y recibo varios errores como este:

type/value mismatch at argument 3 in template parameter list for ''template<class _Tp, class _Sequence, class _Compare> class std::priority_queue''

¿Hay una manera de crear una función de comparación similar a esta pero sin usar una clase?

Gracias


Esto funcionó perfectamente para mí.

struct compare{ bool operator() (const int& p1,const int& p2 ){ return p1<p2; } }; int main(){ priority_queue<int,vector<int>, compare > qu; return 0; }


Puedes usar la función lambda C ++ 11. decltype crear un objeto lambda, pasarlo a la plantilla usando decltype y también pasarlo al constructor. Se parece a esto:

auto comp = [] (int &a, int &b) -> bool { return a < b; }; std::priority_queue<int,std::vector<int>, decltype(comp) > pq (comp);


Puedes usar un typedef. Esto compila muy bien:

typedef bool (*comp)(int,int); bool compare(int a, int b) { return (a<b); } int main() { std::priority_queue<int,std::vector<int>, comp> pq(compare); return 0; }


tienes que especificar el tipo de función y crear una instancia de la función en el constructor de la priority_queue .

#include <functional> bool compare(int a, int b) { return (a<b); } std::priority_queue<int, std::vector<int>, std::function<bool(int, int)>> pq(compare);


std::priority_queue<int, std::vector<int>, bool (*)compare(int, int)> pq(compare);

Es otra forma no mencionada.