dla zdefiniowanej przez użytkownika struct, jak rozumiem, jest to łatwe. Wystarczy przeciążyć operatora <. Jednak dla int/float itp., Czy naprawdę muszę przeciążać operatora < dla int? Oto, co starałem:prosty sposób na utrzymanie sterty min z 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;
}
wyniki są następujące:
initial min heap : 5
5 10 30 20 15
30 10 15 20
teraz pop_heap, push_heap nie utrzyma min sterty poprawnie? Czy jest jakiś łatwiejszy sposób, aby to osiągnąć? Dzięki!
Edytuj: Przepraszam, nie sprawdzałem dokładnie instrukcji. tak, przekazanie kompu do pop_heap lub push_heap powinno załatwić sprawę. Co masz na myśli, nie powinienem używać zewnętrznego komparatora? Jeśli nie jest to właściwa droga, jaki jest wspólny sposób, aby to osiągnąć?
Większy problem polega na tym, że jego komparator jest równoważny z 'int'' 'operator> =', który nie jest porównywalnym słabo-porządkowym komparatorem, a zatem jest nielegalny. – ildjarn
@ildjarn: Dzięki, naprawione. –
Przepraszam, nie sprawdzałem dokładnie instrukcji. tak, przekazanie kompu do pop_heap lub push_heap powinno załatwić sprawę. Co masz na myśli, nie powinienem używać zewnętrznego komparatora?Jeśli nie jest to właściwa droga, jaki jest wspólny sposób, aby to osiągnąć? – user268451