para la estructura definida por el usuario, como yo entiendo, es fácil. Solo sobrecargue el operador <. Sin embargo, para int/float, etc., ¿realmente necesito sobrecargar el operador < para int? Aquí es lo que he intentado:manera fácil de mantener un montón mínimo con stl?
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool comp(const int& a, const int& b)
{
return a<b?false:true;
}
int main()
{
int myints[] = {10,20,30,5,15};
vector<int> v(myints,myints+5);
vector<int>::iterator it;
make_heap(v.begin(), v.end(), comp);
cout << "initial min heap : " << v.front() << endl;
for (unsigned i=0; i<v.size(); i++) cout << " " << v[i];
cout<<endl;
pop_heap (v.begin(),v.end());
v.pop_back();
for (unsigned i=0; i<v.size(); i++) cout << " " << v[i];
cout<<endl;
}
los resultados son los siguientes:
initial min heap : 5
5 10 30 20 15
30 10 15 20
ahora pop_heap, push_heap no mantendrá el min-heap correctamente? ¿hay alguna manera más fácil de lograr esto? Gracias!
Edit: lo siento, no revisé el manual con cuidado. sí, pasar comp a pop_heap o push_heap debería ser el truco. Sin embargo, ¿qué quiere decir con que no debería usar un comparador externo? Si no es el camino correcto, ¿cuál es la forma más común de lograr esto?
El problema más importante es que su comparador es equivalente al operador 'int'> =', que no es un comparador de ordenamiento estricto-débil, y por lo tanto ilegal. – ildjarn
@ildjarn: Gracias, corregido. –
lo siento, no revisé el manual con cuidado. sí, pasar comp a pop_heap o push_heap debería ser el truco. Sin embargo, ¿qué quiere decir con que no debería usar un comparador externo?Si no es el camino correcto, ¿cuál es la forma más común de lograr esto? – user268451