std::sort



  • hab grad nochmal nachgeschaut, wenn du den < operator für eine klasse definiert hast, kannste einfach std::sort mit 2 parametern verwenden.

    parameter brauchste natürlich.
    du musst ja rauskriegen, welches objekte von zweien gleichen typs kleiner ist.
    für mehr infos siehe die hilfe deines compilers zum thema overloading/overloading operators/operator overload



  • bool operator< (Konto *konto1, Konto *konto2) 
    {    
      KontenVec::iterator toFind; 
      toFind = konten.begin() 
    
      if (*toFind)->getKontonummer ()) < (*toFind++)->getKontonummer())
         return true;
    
      return false; 
    }
    

    das problem is das kontonummer in einer anderen klasse ist!!! deshalb brauch ich den iterator...passt das so?
    brauch ich sonst no was???

    cu



  • Hallo,

    Wieso hantierst du da mit nem Iterator rum ?
    Deine Konto klasse hat doch die Methode getKontonummer(), die kannst du doch einfach benutzen.

    inline const bool operator<(const Konto *k1,const Konto *k2){
          return k1->getKontonummer()<k2->getKontonummer(); 
    }
    

    Das reicht.
    std::sort sorget dafür dass die richtigen Paare zum Vergleich ankommen, da brauchst du nicht durch den Vector wandern.

    In deiner Version sind die Parameter für die Katz weil du sie nicht benutzt.
    Und von welchem Typ ist konten ???



  • ich habs nun so:

    int Bank::compare(const Konto* k1, const Konto* k2)
    {
    	if(k1->getKontonummer() < k2->getKontonummer())
    		return 1;
        return k1->getKontonummer() != k2->getKontonummer();
    }
    
    void Bank::sortieren_nach_Kontonummern() 
    { 
       KontenVec::iterator toFind; 
       toFind = konten.begin(); 
       std::sort(konten.begin(), konten.end(), compare); 
    }
    

    ich bekomm eine komisch compiler meldung:

    bank.cpp(243) : error C2664: 'void __cdecl std::sort(class Konto ** ,class Konto ** ,int (__thiscall *)(const class Konto *,const class Konto *))' : Konvertierung des Paramet
    ers 3 von 'int (const class Konto *,const class Konto *)' in 'int (__thiscall *)(const class Konto *,const class Konto *)' nicht moeglich
            Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp ueberein
    

    was da los????



  • du musst Bank::compare machen.



  • sort(konten.begin(), konten.end(),Bank::compare);
    

    funzt a net...gleich meldung kommt!



  • Mach mal statt diesen Zeigern bei der Übergabe Referenzen.

    MfG SideWinder



  • Muss die Vergleichsfunktion nicht static sein?



  • Glaube schon... oder halt ein Funktionsobjekt.



  • Wenns nen Member ist musse static sein.
    Ich versteh allerdings nicht, warum er das nich einfach über den op< implementiert.



  • Weil man manchmal auch nach was anderem sortieren möchte:

    Konten können nach Name oder nach id sortiert werden... oder vielleicht auch nach dem was gerade drauf ist. Welche Sortierung sollte jetzt der op< implementieren?



  • Nach Kontonummern. Das will er doch machen, wie man an seinen Beispielen sieht.
    Die lassen sich doch super vergleichen.

    Oder hab ich es nicht verstanden ?



  • Ja schon, aber da steht nicht, daß er nicht auch mal nach Namen sortieren will. Und wenn er das will, dann ist ein statischer Member angebrachter als der op<.
    Ich wollte ja auch nur ein Beispiel bringen, warum es manchmal sinnvoll ist nicht den op< zu verwenden, sondern ne Vergleicherfunktion.



  • Achso, ok dann hab ich dich missverstanden.

    Letztendlich muss er ja jeden Vergleich irgendwie so deixeln, dass er auf < abgebildet wird.



  • Wenn der op< schon als Nicht-Member deklariert werden soll dann auch die cmp_kontnr.

    Sonst kann ich die dummerweise wieder nicht als Prädikat übergeben weil sie nur einen Parameter hat ;), und wenn etwas binäres als Member in einer Klasse ebenfalls 2 Parameter hat dann ist static die gerechte Bestrafung *g*

    MfG SideWinder


Anmelden zum Antworten