STL: Map aus Klassen sortieren
-
Hallo zusamm'
Wenn ich ne Map habe wie z.B. map<string, int, less<string>> dann werden ja die Elemente beim EInfügen automatisch sortiert.
Nun hab ich aber ne Map aus zwei Klassen: map<t_user, t_serverdata>
Wie kann ich diese sortieren? less<t_user> funktioniert ja wohl kaum, also müßte ich mir selbst eine entsprechende Vergleichsfunktion schreiben, nur hab ich noch nicht so wirklich viel Erfahrung mit STL und demzufolge keinen Plan, wie....
-
versuche es doch mit less, aber dann musst du operator< oder (weiß es net) operator> überladen.
Jedenfalls könnte ich es mir so vorstellen...
-
Na das ging ja fix...
Ich werd das mal probieren, muß ich meine Klasse bissel umstricken. Hört sich jedenfalls an, als könnte es gehen.
Wie kann ich aber eine eigene Vergleichsfunktion bauen? Denn u.U. möchte ich die Elemente unter vershiedenen Gesichtspunkten sortieren (die Klasse t_user enthält so einiges)
-
Nun, alternativ kannst du ja auch einen Functor als 3. Parameter übergeben, der die Sortierung speziell für den Fall übernimmt.
Z.B.struct bla { int operator()(const Klasse& a, const Klasse& b) { if(a.getIrgendwas() < b.getIrgendwas()) return -1; if(a.getIrgendwas() > b.getIrgendwas()) return 1; return 0; } };
Dann als 3. Templateargument bla übergeben, aber frag nicht, wie ich darauf komme...
MfG MAV
PS: Auf Rücksicht nehm ich keine Verluste.
-
Der Funktor sollte eher so aussehen:
struct VergleicheZweiFoos // bei Bedarf noch von std::binary_function ableiten { bool operator()(const Foo& a, const Foo&b) const { return ob_a_vor_b_sein_soll; } };
Oder einfach:
bool vergleichsFunktion(const Foo& a, const Foo& b) { return ob_a_vor_b_sein_soll; }
-
Erstmal danke für die schnelle Hilfe.
Wie schreibe ich das dann aber? So:map<t_user, t_serverdata, VergleicheZweiFoos()> //bzw: map<t_user, t_serverdata, VergleichsFunktion()>
Ich kann es leider grad nicht testen, denn mein C-Builder scheint schon in den Osterferien zu sein, jedenfalls generalstreikt er gerade ein bissel...
-
Postman schrieb:
Wie schreibe ich das dann aber? So:
map<t_user, t_serverdata, VergleicheZweiFoos()> //bzw: map<t_user, t_serverdata, VergleichsFunktion()>
Nein. Der dritte Parameter muss ein *Typ* sein. Also so:
int main() { map<Foo, t_serverdata, VergleicheZweiFoos> m1; // bzw. map<Foo, t_serverdata, bool(*)(const Foo&, const Foo&)> m2(vergleichsFunktion); }
-
Aha, danke, jetzt hab ichs gerafft