STL Set - Abspeichern von sortierten Punkten
-
Hallo Leute,
ich habe folgendes Problem. Ich bekomme eine Liste von Punkten als Input und möchte diese gerne sortiert und ohne Duplikate in einer Datenstruktur abspeichern. IMHO eignet sich ein STL::Set dafür am besten, da es sortiert und doppelte Einträge verhindert (anhand des Keys). Folgender Code funktioniert bei mir jedoch nicht. Die Punkte werden zwar sortiert eingetragen, jedoch gibt es trotzdem gleiche Punkte (also mit den selben Koordinaten) in dem Set. Scheinbar greift der == Operator nicht, der < Operator schon.
Zuerst dachte ich, es hängt mit dem Float-Vector zusammen, aber auch mit den Int-Values klappt der Vergleich auf schon vorhandene Elemente nicht!
Ich habe irgendwo gelesen, dass generell beim Set nur der < Operator verwendet wird, für die Sortierung UND für den Gleichheitsvergleich. Wie müsste ich also den überladenen Operator anpassen, sodass gleiche Punkte (anhand des coord-Vectors) nicht abgespeichert werden?
Vielen Dank,
Stevenstruct COLORED_POINT { public: int index; std::vector<float>coord; std::vector<int>testInt; bool operator<(const COLORED_POINT& c1) const { return (this->index < c1.index); } // Geht nicht bool operator==(const COLORED_POINT& c1) const { return (this->coord == c1.coord); } // Geht auch nicht /* bool operator==(const COLORED_POINT& c1) const { return (this->testInt== c1.testInt); } */ }; ... std::set<COLORED_POINT> _pointSet; COLORED_POINT cp1, cp2; // Punkt 1 indexCounter++; p1 = v1->getPoint(); // Ein Punkt mit Koordinaten x=1, y=1, z=0 cp1.coord = p1; cp1.index = indexCounter; // Index = 1 cp1.testInt.push_back(1); thisp->_pointSet.insert(cp1); // Punkt in Set einfügen, OK // Punkt 2 indexCounter++; p2 = v2->getPoint(); // Ein Punkt mit denselben Koordinaten wie p1 cp2.coord = p2; cp2.index = indexCounter; // Index = 2 cp2.testInt.push_back(1); thisp->_pointSet.insert(cp2); // Punkt in Set einfügen (dürfte eigentlich nicht eingefügt werden, weil ein Punkt mit diesen Koordinaten schon vorhanden ist!)
-
Ja, das set benutzt nur < für Vergleiche. (Und an ganz bestimmten Stellen auch mal ==, aber nicht für die interne Ordnung). Du müsstest dir also überlegen, wie du dreidimensionale Punkte eindeutig nach kleiner und größer ordnen kannst. Du könntest z.B. zuerst die erste Koordinate vergleichen, ist diese gleich die nächste, usw.
-
ekschperte schrieb:
Die Punkte werden zwar sortiert eingetragen, jedoch gibt es trotzdem gleiche Punkte (also mit den selben Koordinaten) in dem Set. Scheinbar greift der == Operator nicht, der < Operator schon.
std::set hat als zweiten Template-parameter einen Ordnungs-Funktor (Comparator), per default std::less. Der benutzt in deinem Fall den operator< zum Vergleichen, operator== wird nicht berücksichtigt. Der Comparator muss eine Strenge Ordnung ergeben, d.h. keine Ringe a<b und b<c und c<a darf nicht gleichzeitig gelten, und Gleichheit beteudet, dass !(a<b) && !(b<a)