std::sort - frage



  • Hoi !

    Wie kann ich mit std::sort nach 2 Kategorien sortieren ?
    (Texture, Type)

    Ich bräuchte das für ne Renderreihenfolge im VB.

    Thx



  • Indem du deinen < Operator so schreibst. (Gehört aber nicht in dieses Teilforum)

    Bye, TGGC



  • Oder aber Du schreibst Dir einen passenden Functor:
    http://www.sgi.com/tech/stl/sort.html



  • @ TGGC:

    Langsam besserst du dich, das is echt gut 🙂

    RE: Operator <
    Ja das weiss ich aber wie soll das mit 2 Dingern aussehen ?



  • Nach 2 Kategorien gleichzeitig sortieren wird mit operator< nicht möglich sein, darum meinte ich ja auch Du solltest Dir Deinen eigenen Functor schreiben!



  • ich glaub ich verschieb das hier mal...
    wenns grafik- oder spiele-spezifischer wird, kannst du hier ja noch einen thread eröffnen.

    -> C++



  • Eine der Beiden Kriterien hat wohl eine höhere Proirität. Die testest du zu erst und bei unklarheit nimmst du die zweite.

    Weiso muss ich einen Funktor schreiben, wenn es eine Funktion auch tut? Welche zustände soll sich der Funktor merken? Wahrscheinlich überseh ich wieder irgendwas.

    Und operator < ist eine Funktion, wie jede andere auch. Warum sollte also eine Funktion funktionieren, ein Operator aber nicht?



  • Hm, war ein Denkfehler meinerseits; ich dachte an sowas ähnliches was aber zugegebenermaßen keinen großen Sinn macht:

    struct sortItNo1 : public binary_function<const element&, const element&, bool> 
    { 
        bool operator() (const element& lhs, const element & rhs) const 
        {
            return lhs.type() < rhs.type(); 
        }
    };
    
    struct sortItNo2 : public binary_function<const element&, const element&, bool> 
    { 
        bool operator() (const element& lhs, const element & rhs) const 
        {
            if (lhs.type() == rhs.type())
                return lhs.textureNo() < rhs.textureNo(); 
        }
    };
    
    sort(renderList.begin(), renderList.end(), sortItNo1());
    sort(renderList.begin(), renderList.end(), sortItNo2());
    


  • Helium schrieb:

    Und operator < ist eine Funktion, wie jede andere auch. Warum sollte also eine Funktion funktionieren, ein Operator aber nicht?

    Das Problem ist, das du den < Operator bei Pointern nicht überschreiben kannst => Listen mit Pointern würden immer nach der Adresse geordnet.

    P.S.: Hey, das es von meinem Niveau noch weiter nach oben ging, unglaublich!

    Bye, TGGC



  • bool texture_and_type_compare (const element& lhs, const element & rhs)
    {
    if (lhs.texture() < rhs.texture()
    return true;
    else if (lhs.type() == rhs.type())
    return lhs.textureNo() < rhs.textureNo();
    }


Anmelden zum Antworten