std::list schnell sortieren



  • wenn du mir noch sagen würdest wie man das benutzt wäre alles ok



  • Das kannst Du jetzt eigentlich ganz leicht mit Deinem Lieblingsbuch/ Tutorial herausfinden; ist ganz einfach:

    http://www.sgi.com/tech/stl/List.html
    http://www.sgi.com/tech/stl/sort.html



  • finde nur Samples für Zahlen sonst nix



  • #include <list>
    
    std::list<_item> items;
    ...
    items.sort();
    

    Hat _item keinen op= und op< und/oder willst du anders sortieren als "normal" kannst du ein Prädikat bauen:

    struct sort_by_name
    {
       bool operator() (_item lhs, _item rhs)
       {
           // tu was
       }
    };
    
    items.sort(sort_by_name());
    

    Liste und Vektor sind insofern wenig kompatibel, weil ein Vektor einen Random-Access-Iterator liefert und eine Liste nur einen bidirektionalen Iterator - klar eine Liste kann man nur von vorne nach hinten durchlaufen, ein Element eines Vektors ist Basisadresse*Index fertig. Für alle Container die Random-Access-Iteratoren anbieten kann man eine gemeinsame sort-Methode aus der STL benützen:

    #include <algorithm>
    
    ...
    std::sort(items.begin(),items.end());
    // bzw. wieder mit prädikat:
    std::sort(items.begin(),items.end(),sort_by_name());
    

    Da dies mit einer Liste wie gesagt nicht möglich ist bringt sie ihren eigenen sort mit.

    MfG SideWinder



  • Danke, aber was kommt hier rein?

    struct sort_by_name 
    { 
       bool operator() (_item lhs, _item rhs) 
       { 
           // tu was 
       } 
    };
    


  • Sinngemäß: return lhs < rhs;



  • wie solln das gehen?



  • oh man, jetzt stellst du aber absichtlich auf Durchzug, oder? Die Struktur sort_by_name implementiert den operator (). Diese Funktion ist ein Prädikat und gibt an, wann eins von den beiden übergebenen Objekten "kleiner" ist als das andere. Nach welcher Metrik du das beurteilst ist vollständig dir überlassen - das ist der Sinn eines Prädikats. Die Funktion soll true zurückliefern, wenn das erste Element "kleiner" ist als das zweite, sonst false. list::sort benutzt jetzt diese Prädikat-Funktion um die Liste zu sortieren. Immer wenn es zwei Objekte vergleichen muss, ruft es die Funktion auf und die sagt ihr welches kleiner ist...ich hoffe das hat geholfen

    Mfg, smasher1985



  • oder vergiss vorläufif das mit dem prädikat.
    dein code

    typedef struct _item 
    { 
        std::wstring name; 
        unsigned int value; 
    } item;
    

    verrät den kollegen wie std::sort leider nicht, wann ein item kleiner als ein anderes ist.
    also ich heile mal den code.

    1. typedef weg.

    struct item 
    { 
        std::wstring name; 
        unsigned int value; 
    };
    

    seit c++ sind nämlich structs auch echte typen. brauchsat beim verwenden nicht mehr struct item zu schreiben, einfach item geht.

    2. op< bauen

    struct item 
    { 
        std::wstring name; 
        unsigned int value; 
        friend bool operattor<(item const& a,item const& b){
           if(a.name<b.name) return true;
           if(a.name>b.name) return false;
           if(a.value<b.value) return true;
           return false;
        }
    };
    

    so, jetzt kann man zwei items mit dem operator y vergleichen. und jetzt können viele algorithmen aus der standard-lib damit arbeiten.

    zur sicherheit noch nen op== einbauen.

    struct item 
    { 
        std::wstring name; 
        unsigned int value; 
        friend bool operattor<(item const& a,item const& b){
           if(a.name<b.name) return true;
           if(a.name>b.name) return false;
           if(a.value<b.value) return true;
           return false;
        }
        friend bool operattor<(item const& a,item const& b){
           return a.name==b.name && a.value==b.value;
        }
    };
    


  • Hihi, ich möchte wissen ob du die klitzekleinen Dinger einbaust um zu schauen, ob der Frager den Code auch genauer ansieht oder ob er das nur kopiert, oder ob du die unabsichtlich einbaust *g*

    MfG SideWinder



  • @volkard:
    sieht so ein operator == aus?

    friend bool operattor<(item const& a,item const& b){ 
           return a.name==b.name && a.value==b.value; 
        }
    

    😉



  • guro schrieb:

    @volkard:
    sieht so ein operator == aus?

    friend bool operattor<(item const& a,item const& b){ 
           return a.name==b.name && a.value==b.value; 
        }
    

    😉

    ja, ich erkenne ihn wieder.
    der hat mal bei mir gewohnt. grüß' ihn von mr.



  • volkard ist end der noob. wie kann man bloß so einen peinlichen fehler machen???



  • Selber noch mitdenken ist halt eben ausdrücklich erlaubt.



  • nup-hasser schrieb:

    volkard ist end der noob. wie kann man bloß so einen peinlichen fehler machen???

    hmm....wenn mans absichtlich macht?


Anmelden zum Antworten