Alex: Vektorsortierung in C++

Hallo,

ich möchte in C++ einen Vektor von Objekten nach einer der Membervariablen dieser Objekte sortieren. Das ist an sich kein Problem, wenn ich eine Vergleichsfunktion als dritten Parameter für std::sort mitgebe oder den Operator < dieser Objekte überlade.

Allerdings soll die Sortierung von einem Parameter abhängig sein, den die std::sort aufrufende Funktion festlegt. Nun bräuchte ich sowas wie Lambda-Funktionen, um std::sort eine entsprechende Funktion mitzugeben. Das scheint's in C++ nicht standardmäßig zu geben. Alternativ kann ich vor dem Sortieren jedem Objekt diesen Parameter über eine seiner Membervariablen mitgeben. Das scheint mir allerdings etwas umständlich. Gibt's noch andere, bessere Lösungen?

Grüße.

  1. Hallo Alex,

    Allerdings soll die Sortierung von einem Parameter abhängig sein, den die std::sort aufrufende Funktion festlegt. Nun bräuchte ich sowas wie Lambda-Funktionen, um std::sort eine entsprechende Funktion mitzugeben. Das scheint's in C++ nicht standardmäßig zu geben. Alternativ kann ich vor dem Sortieren jedem Objekt diesen Parameter über eine seiner Membervariablen mitgeben. Das scheint mir allerdings etwas umständlich. Gibt's noch andere, bessere Lösungen?

    Du kannst statt einer Funktion auch einen Funktor verwenden:

    class MyCompare {  
      private:  
        int parameter;  
      public:  
        // Construktor & Copy-Construktor  
        MyCompare(int parameter) : parameter(parameter) {}  
        MyCompare(const MyCompare& o) : parameter(o.parameter) {}  
      
        // hiermit lassen sich objekte dieser klasse dann aufrufen  
        // d.h. sowas wie  
        //    MyCompare foo(23);  
        //    bool result = foo(o1, o2);  
        bool operator() (ObjektTyp i, ObjektTyp j) {  
          // gib etwas in abhängigkeit von i, j und parameter zurück  
        }  
    }  
      
    vector<ObjektTyp> v;  
    // v füllen  
      
    MyCompare compare(42); // mit parameter initialisieren  
    sort(vec.begin(), vec.end(), compare);
    

    Viele Grüße,
    Christian

    1. Hi Christian,

      Du kannst statt einer Funktion auch einen Funktor verwenden:

      Sieht gut aus. Dankeschön.