que priority greater geeksforgeeks c++ stl lambda c++11 priority-queue

greater - C++ priority_queue con lambda comparator error



queue c++> reference (2)

Tengo el siguiente código erróneo que estoy tratando de compilar en VC2010, pero estoy obteniendo el error C2974 Esto solo ocurre cuando C2974 la expresión lambda, así que supongo que tiene algo que ver con eso.

typedef pair<pair<int, int>, int> adjlist_edge; priority_queue< adjlist_edge , vector<adjlist_edge>, [](adjlist_edge a, adjlist_edge b) -> bool { if(a.second > b.second){ return true; } else { return false; } }> adjlist_pq;

Sé que la forma de la definición de la plantilla es correcta como

priority_queue<int , vector<int>, greater<int>> pq;

Funciona como se esperaba ¿Alguna idea de lo que estoy haciendo mal? ¿Hay algo obviamente mal con la lambda que se ve mal que podría estar pasando por alto? ¡Gracias por leer!


Primero defina el objeto lambda, luego páselo al tipo de plantilla usando decltype y también páselo directamente al constructor.

auto comp = []( adjist a, adjlist b ) { return a.second > b.second; }; priority_queue< adjlist_edge , vector<adjlist_edge>, decltype( comp ) > adjlist_pq( comp );


priority_queue toma el comparador como un argumento de plantilla. Las funciones de Lambda son objetos y, por lo tanto, no pueden utilizarse como argumentos de plantilla (solo pueden existir muy pocos tipos, entre ellos los tipos integrales).

Puedes intentar usar decltype allí:

priority_queue< adjlist_edge , vector<adjlist_edge>, decltype( [](adjlist_edge a, adjlist_edge b) -> bool { if(a.second > b.second){ return true; } else { return false; } })> adjlist_pq( [](adjlist_edge a, adjlist_edge b) -> bool { if(a.second > b.second){ return true; } else { return false; } } );

Si falla ( y lo hará ), puede usar la function<> :

priority_queue< adjlist_edge , vector<adjlist_edge>, function<bool(adjlist_edge,adjlist_edge)> > adjlist_pq( [](adjlist_edge a, adjlist_edge b) -> bool { if(a.second > b.second){ return true; } else { return false; } } );