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 🙂


  • Mod

    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;} ); // ungetestet
    

    Mit 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. 😉


  • Mod

    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.


  • Mod

    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).

    A ist 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. 😮


Anmelden zum Antworten