per struct definito dall'utente, come ho capito, è facile. Basta sovraccaricare l'operatore <. Tuttavia, per int/float, ecc., Devo veramente sovraccaricare l'operatore < per int? Ecco cosa ho provato:un modo semplice per mantenere un heap minimo 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;
}
i risultati sono:
initial min heap : 5
5 10 30 20 15
30 10 15 20
ora pop_heap, push_heap non manterrà correttamente il min-heap? c'è un modo più semplice per raggiungere questo obiettivo? Grazie!
Modifica: scusate, non ho controllato attentamente il manuale. sì, passare il comp a pop_heap o push_heap dovrebbe fare il trucco. Tuttavia, cosa intendi, non dovrei usare un comparatore esterno? Se non è la strada giusta, qual è il modo comune per raggiungere questo obiettivo?
Il problema più grande è che il suo comparatore è equivalente a 'int''s' operator> = ', che non è un comparatore di ordine rigoroso-debole, e quindi illegale. – ildjarn
@ildjarn: Grazie, risolto. –
scusate, non ho controllato attentamente il manuale. sì, passare il comp a pop_heap o push_heap dovrebbe fare il trucco. Tuttavia, cosa intendi, non dovrei usare un comparatore esterno?Se non è la strada giusta, qual è il modo comune per raggiungere questo obiettivo? – user268451