Problem mit std::sort Funktion



  • Hi Folks,

    ich habe ein Problem beim Sortieren einer std::list. Sinngemäß sieht mein Code so aus:

    #define ABWEICHUNG 0.001f
    
    class vector3d {
        public:
            vector3d() : X(0), Y(0), Z(0) {}
            vector3d(float X_, float Y_, float Z_) { X = X_; Y = Y_; Z = Z_; }
            float X, Y, Z;
    };
    
    bool cmp(vector3d &Pos1, vector3d &Pos2) {
        return Pos1.X > Pos2.X - ABWEICHUNG && Pos1.X < Pos2.X + ABWEICHUNG &&
               Pos1.Y > Pos2.Y - ABWEICHUNG && Pos1.Y < Pos2.Y + ABWEICHUNG &&
               Pos1.Z > Pos2.Z - ABWEICHUNG && Pos1.Z < Pos2.Z + ABWEICHUNG;
    }
    
    std::list<vector3d> KoordinatenListe;
    
    KoordinatenListe.push_back( vector3d(1, 2, 3) );
    KoordinatenListe.push_back( vector3d(0, 0, 0) );
    KoordinatenListe.push_back( vector3d(3, 4, 4) );
    KoordinatenListe.push_back( vector3d(0, 0, 0) );
    KoordinatenListe.push_back( vector3d(7, 8, 3) );
    KoordinatenListe.push_back( vector3d(1, 2, 3) );
    KoordinatenListe.push_back( vector3d(3, 4, 4) );
    
    KoordinatenListe.sort( cmp );
    
    /*
    So sollte es nach dem Sortieren EIGENTLICH sortiert sein:
    
    1, 2, 3
    1, 2, 3
    0, 0, 0
    0, 0, 0
    3, 4, 4
    3, 4, 4
    7, 8, 3
    
    Ob insgesammt aufsteigend oder nicht ist egal, wichtig ist nur dass alle
    gleichen (bzw. mit einer Abweichung von 'ABWEICHUNG') Koordinaten HINTEREINANDER stehen!
    */
    

    Wie bekomme ich das hin? 😕



  • Du mußt die cmp-Funktion so programmieren, daß sie einem "logisch kleiner" entspricht (nicht einem "logisch gleich"):

    return pos.X < pos2.X || (pos.X == pos2.X && (pos.Y < pos2.Y ||
                             (pos.Y == pos2.Y && pos.Z < pos2.Z)));
    

    ich hoffe, ich hab mich jetzt nicht bei der Klammerung vertan...

    Das mit der Abweichung verstehe ich nicht so ganz, was du meinst...



  • Soll das bedeuten dass man bei der 'VergleichsFunktion' nur '<' verwenden kann und nicht '>' oder '==' etc.?



  • LukasBanana schrieb:

    Soll das bedeuten dass man bei der 'VergleichsFunktion' nur '<' verwenden kann und nicht '>' oder '==' etc.?

    Die kannst du immer gebrauchen, sofern sie Sinn machen..



  • @Th69: Vielen Danke! 🙂 Hat wunderbar funktioniert 👍


Anmelden zum Antworten