Frage zur Programmlogik (sort)



  • Hallo, kurze Frage zur richtigen Verwendung von sort (aus <algorithm> ). Ich habe einen std::vector mit objekten, die jeweils eine eigenschaft namens id haben. Das ist ein unsigned int, das die werte 1 bis 9 annehmen kann. Jetzt soll der vector so sortiert werden, dass am anfang alle objekte stehen, deren id 3 oder 8 ist. Danach sollen alle anderen ids kommen. Wie genau sortiert wird ist egal. Mein Ansatz ist folgender

    bool sort_pred(const foo& bar1, const foo& bar2)
    {
        //beide objekte haben id 3 oder 8
        if( (bar1.id==3 || bar1.id==8) && (bar2.id==3 || bar2.id==8) ) return false;
        //nur das rechte objekt hat id 3 oder 8
        if( (bar1.id!=3 && bar1.id!=8) && (bar2.id==3 || bar2.id==8) ) return false; 
        //nur das linke objekt hat id 3 oder 8
        if( (bar1.id==3 || bar1.id==8) && (bar2.id!=3 && bar2.id!=8) ) return true;
        //kein objekt hat id 3 oder 8
        return false;
    }
    
    sort(vec.begin(), vec.end(), sort_pred);
    

    Stimmt das so? Kann es im Moment nicht testen. Gibt es vielleicht eine einfachere/bessere Lösung für dieses Problem?

    Schonmal Danke für alle Ideen!



  • Stimmt so.



  • viel einfacher:

    bool sort_pred(const foo& bar1, const foo& bar2)
    {
        if( (bar1.id==3 || bar1.id==8) )
          return true;
        if( (bar2.id==3 || bar2.id==8) )
          return false;
    
        return false;
    }
    

    da es ja egal ist, wie genau sortiert wird, sollte das auch gehen...
    falls du kommutativität brauchst, geht auch dein code nicht... müsstest du nur das letzte false durch bar1.id < bar2.id ersetzen...

    bb



  • Mein Vorschlag:

    int func38( int i )
    {
        switch( i )
        {
        case 3:
        case 8:
            return 0;
        }
        return 1;
    }
    bool sort_pred( const foo& bar1, const foo& bar2 )
    {
        return func38( bar1.id ) < func38( bar2.id );
    }
    

    Die Variante von unskilled könnte auch in einer Endlos-Schleife enden, abhängig von der Implementierung des sort-Algorithmus. Z.B. wenn alle ids 3 oder 8 sind und intern BubbleSort verwendet wird (i.A. wenn die Anzahl der Elemente sehr klein ist).
    Lt. Standard müssen die Elemente 'strict weak ordered' sein:

    For the algorithms to work correctly,
    comp has to induce a strict weak ordering on the values.

    Das erfüllt die Variante nicht.

    Gruß
    Werner


Anmelden zum Antworten