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 