Ein Struct nach einem Element sortieren?
-
Ich habe eine Struktur bestehend aus drei Vectoren. Alle drei Vectoren haben die gleiche Länge. Ich möchte nun die Struktur nach einem Vector aufsteigend sortieren. Dabei sollen die anderen zwei Vektoren entsprechend dem ersten mit sortiert werden, so, dass die Beziehung zwischen denen erhalten bleibt.
Weiss jemand wie so eine Sortierung möglich ist?
-
Ich sehe zwei Möglichkeiten:
1. non-intrusive: Du schreibst den Sortieralgorithmus selbst (zB bubblesort ist einfach, aber nicht grad schnell) und tauschst dann eben die entsprechenden Felder der Vektoren miteinander.
2. du machst sowas:
struct combinedData { int a, b, c; }; struct myStruct { vector<combinedData> data; }; myStruct obj; // obj füllen irgendwie // sortieren: std::sort(obj.data.begin(), obj.data.end()); // Der Vergleichsoperator für deine kombinieren Daten, die immer zusammengehörig sind. bool operator<(const combinedData& lhs, const combinedData& rhs) { return lhs.a < lhs.b; }
Ich empfehle dir die zweite Variante. Aus deinem Post entnehme ich, dass Elemente mit gleichem Index in den Vektoren irgendwie zusammen gehören. Warum dann nciht gleich in eine Struct packen und nur noch einen vector nutzen.
-
Was für einen Vector denn? Du kannst dafür std::sort benutzen.
-
Danke Maxi. Der zweite Tipp ist super, aber ich weiß leider nicht wo man den
Vergleichsoperator in dieser Form definieren soll.
-
el_vital schrieb:
Der zweite Tipp ist super, aber ich weiß leider nicht wo man den
Vergleichsoperator in dieser Form definieren soll.Da wo du auch die Klasse definierst, für deid er Vergleichsoperator sein soll. Auch wenn es sich um freie Funktionen handelt gehören sie zum Klasseninterface.
-
Zum Tipp von Maxi: Falls du schon einen operator< definiert hast, der die natürliche Sortierweise der Struktur festlegt, kannst du auch ein Prädikat definieren. Ein solcher Funktor bekommt dann zwei Vektorelemente bspw. der ersten Vektoren der Strukturen, vergleicht diese und gibt das Ergebnis zurück. Letztendlich kannst du so alternative Sortiervorschriften definieren, wie sort_by_1st_vector...
Kurz in Code:
struct my_vector_struct { vector<int> v_int; vector<float> v_char; vector<string> v_string; }; struct by_1st_vector { bool operator()(const my_vector_struct& lhs, const my_vector_struct& rhs) { // v_ints von lhs und rhs entsprechend miteinander vergleichen } }; int main() { vector<my_vector_struct> v; // füllen... sort(v.begin(), v.end(), by_1st_vector()); }