logo c++ stl heap comparator min-heap

logo - Comparador para min-heap en C++



hbase (3)

Quieres llamar a make_heap en el vector de nuevo, no sort_heap . make_heap reorganizará todo tu vector en un montón mínimo dado el comparador mayor que el orden_heap ordena tu elemento en orden ascendente y ya no es un montón en absoluto!

#include <algorithm> #include <iostream> #include <vector> struct greater1{ bool operator()(const long& a,const long& b) const{ return a>b; } }; int main() { unsigned int myints[] = {10,20,30,5,15}; vector<unsigned int> v(myints, myints+5); //creates max heap std::make_heap(v.begin(). v.end()); // 30 20 10 5 15 //converts to min heap std::make_heap(v.begin(). v.end(), greater1()); // 5 15 10 20 30 unsigned int s = v.size(); //ALSO NEED TO PASS greater1() to pop()!!! for(unsigned int i = 0; i < s; i++) std::pop_heap(v.begin(). v.end(), greater1()); // popping order: 5 10 15 20 30 return 0; }

Estoy tratando de hacer un min-heap 1 de long s en C ++ usando STL make_heap , etc., pero mi comparador no parece estar comparando correctamente. El siguiente es mi comparador actual:

struct greater1{ bool operator()(const long& a,const long& b) const{ return a>b; } };

Sin embargo, cuando hago std::pop_heap(humble.begin(),humble.end(),g); donde g es una instancia de greater1 y humble es un montón que hace [9,15,15,25] cuando se llama sort_heap , obtengo un 15 pop.

¿Mi comparador es correcto? ¿Qué podría estar yendo mal?

EDITAR:
Me di cuenta de que estoy ejecutando sort_heap sin comparador, mientras que cuando lo ejecuto, obtengo [15,15,9,25] de sort_heap . Ahora estoy pensando que mi comparador definitivamente no funciona, pero no estoy seguro de por qué.

1 El STL crea un max-heap por defecto, así que necesito un comparador.


Tal vez le falta algo en algún lugar, el siguiente código funciona según lo previsto:

#include <vector> #include <algorithm> #include <iostream> struct greater1{ bool operator()(const long& a,const long& b) const{ return a>b; } }; int main() { std::vector<long> humble; humble.push_back(15); humble.push_back(15); humble.push_back(9); humble.push_back(25); std::make_heap(humble.begin(), humble.end(), greater1()); while (humble.size()) { std::pop_heap(humble.begin(),humble.end(),greater1()); long min = humble.back(); humble.pop_back(); std::cout << min << std::endl; } return 0; }


solo usa greater<int>() . Está predefinido en estándar.