Sortieren mit der STL
-
Hi,
hab ein kleines Verständnisproblem mit den Sortieralgorithmen. Irgendwie ist mir die Verwendung von Vergleichs- und Sortieralgorithmen der STL nicht ganz klar. Mit STL-Containern und Klassentemplates komme ich ganz gut zurecht. Aber wie sortiere ich Container mit eigenen Klassen?
Ein Beispiel:
struct vertex { std::string desc; color color; float x; float y; } std::vector<vertex> list; fill(list); // TODO: aufsteigend sortieren von x und y ???Gibt's irgendwo einschauliche Tutorials dafür?
-
Du must dir halt selbst ein algorithmus schreiben, ich glaub nicht das standart Algorithmen alzuviel mit deiner Klasse anfangen können.
-
Hi
Dazu musst Du den Operator < und > für Deine eigene Klasse implementieren.
Dann kannst Du selbst sagen wonach sortiert werden soll. erst x dann y oder umgekehrt.
-
Storm.Xapek.de schrieb:
Du must dir halt selbst ein algorithmus schreiben, ich glaub nicht das stan**** Algorithmen alzuviel mit deiner Klasse anfangen können.
Das ist doch gerade der Trick an der STL, daß es eben doch geht.

-
Wenn man die Vergleichsoperationen der Klasse nicht definieren kann bzw. will, kann man bei der sort-Fkt. auch eine Vergleichsfkt. angeben. Wie müsste die Fkt. für das Beispiel ungefähr aussehen?
// EDIT:
Vllt. so:bool compare(vertex a, vertex b) { if (a.x < b.x) return true; else if (a.x == b.x && a.y < b.y) return true; return false; } sort(list.begin(), list.end(), compare);
-
So funktionierts. War doch nicht so schwer.

-
Eine Sache vielleicht noch. IMHO solltest du die Funktion nicht compare nennen. compare sieht normalerweise folgendermaßen aus:
int compare(object &lhs, object &rhs) { if(lhs ist kleiner als rhs) return -1; if(lhs ist größer als rhs) return 1; return 0; }Deine Funktion würd ich [Vertex]Smaller() nennen.
-
warum nicht einfach
struct vertex { std::string desc; color color; float x; float y; bool operator< (const vertex& other) { return desc < other.desc && color < other.color && x < other.x && y < other.y; } };