std::list schnell sortieren



  • 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