Sortieren eines Vektors mit einem Strukt
-
Hallo zusammen,
ich bin leider auf ein Problem gestoßen, für das ich bisher keine Lösung finden konnte.
Ich habe ein Struct, das wie folgt aufgebaut ist:
struct AE{ Point2i v1; Point2i v2; }; vector<AE> AfEd;Es könnte z.B. diese Wertepaare erhalten:
AfEd[0]: (5,1)(3,4) AfEd[1]: (2,5)(6,22) AfEd[2]: (6,3)(6,2)Wie schaffe ich es den Vektor nach dem ersten Wert des ersten Wertepaares zu sortieren?
Das hier sollte herauskommen:
AfEd[0]: (2,5)(6,22) AfEd[1]: (5,1)(3,4) AfEd[2]: (6,3)(6,2)Ich habe leider nicht die geringste Idee, wie ich das anstellen kann

Vielen Dank für die Hilfe

-
Wie schaffe ich es den Vektor nach dem ersten Wert des ersten Wertepaares zu sortieren?
std::sort( std::begin(AfEd), std::end(AfEd), [] (AE const& lhs, AE const& rhs) {return lhs.v1.x < rhs.v1.x;} ); // ungetestetMit C++98 sieht es ähnlich aus.
bool myCompare(AE const& lhs, AE const& rhs) { return lhs.v1.x < rhs.v1.x; } // ... std::sort( AfEd.begin(), AfEd.end(), myCompare ); // ebenfalls ungetestetÜbrigens solltest du ggf. die Namenswahl etwas ernster nehmen

-
Vielen Dank,
die Lösung funktioniert einwandfrei

Leider verstehe ich den Code nicht vollständig.
Was genau bedeutet oder macht der Teil ab "AE const"?
Ich möchte ja auch was lernen
Das mit der Namensgebung nehme ich mir in Zukunft zu Herzen.

-
Vektor schrieb:
Was genau bedeutet oder macht der Teil ab "AE const"?
Vorher verstehst du alles, danach nicht mehr?
Glaube ich dir nicht. Oder du guckst nicht genau genug hin und hast die [] nicht gesehen. Merke: Code ist kein zufällig zusammen gewürfelter Haufen Zeichen, Code ist Logik pur. Du musst von jedem Zeichen genau wissen, warum es wo gesetzt ist. Wusstest du, dass [] einen Lambda-Ausdruck einleitet? Dann ist der Rest doch auch klar. Oder wenn du es nicht wusstest, dann weißt du nun, nach welchem Stichwort du suchen musst. Das ist so eine Art Minifunktion, die man lokal definieren kann. In diesem Fall einfach die Funktion aus dem 2. Beispiel, aber eben direkt in den sort-Aufruf geschrieben.
-
Was genau bedeutet oder macht der Teil ab "AE const"?
Verschiedene STL-Algorithmen nehmen einen
Comparator(zu Deutsch mehr oder weniger ein Vergleicher), ein Funktionsobjekt* das zwei Elemente entsprechenden Typs vergleicht.Sie nehmen standardmäßig eine Spezialisierung von
std::less, ein Funktionsobjekt-Typ der einfach - wie sein Name schon andeutet - den < Operator verwendet.Man kann aber auch sein eigenes Funktionsobjekt übergeben. Das geschieht oben.
Zusätzlich nutze ich im ersten Code ein mit C++11 eingeführtes Feature namens Lambda. Der Typ eines Lambdas ist eine Klasse (welche den
operator()überlädt). Sie sind natürlich ebenfalls Funktionsobjekte, da man sie wie gewöhnliche Funktionen aufrufen kann; einige können sogar wie Funktionen zu Funktionszeigern zerfallen. Hier dient das Lambda als Comparator - was es tut sollte klar sein.Weniger intuitiv dürfte die Syntax sein, es ist allerdings zu kompliziert all das in diesem Post zu erklären - besitzt du kein (aktuelles) Grundlagenbuch so besuche die in meiner Signatur verlinkte Linkliste oder richte dich nach einem Tutorial.
* Ein Funktionsobjekt ist ein Objekt welches wie eine Funktion aufgerufen werden kann. Dazu gehören aber nicht Funktionen selbst - diese sind nämlich keine Objekte. Übergibst du einen Funktionsnamen an ein solches STL-Funktionstemplate wird das Argument zu einem Funktionszeiger zerfallen (function to pointer decay).
Aist in folgendem Beispiel ein Funktionsobjekt-Typ.struct A { bool operator()( int a, int b ) const { return a*7 > b; } };Mir fällt gerade auf dass ja der Begriff 'Funktor' genau dasselbe bezeichnen soll wie 'Funktionsobjekt'. Hatte ich ganz tief noch von C++ von A bis Z, glaube ich.
