C ++ std :: set Suche nach Funktionsüberladung == operator

8

Ich benutze Sätze. Ich benutze eine benutzerdefinierte Struktur als Schlüssel. Ich füge einen Wert ein und versuche den eingegebenen Wert zu finden. Aber es scheint nie das Element zu finden.

Ich habe sowohl den == Operator als auch den & lt; Betreiber.

Hier ist der Code der Struktur:

%Vor%

Und das ist der Code von main

%Vor%

Es schlägt immer in der assert-Anweisung fehl. Was mache ich falsch?

Edit -Ok jetzt verstehe ich, dass es den Operator == überhaupt nicht verwendet. Hier ist was ich will. Ich brauche die Datenstruktur nach Entfernung sortiert. Aber ich sollte es mit der ID entfernen können. Gibt es dafür einen sauberen Weg oder eine bereits vorhandene Datenstruktur?

    
The Flying Dutchman 23.08.2012, 07:44
quelle

3 Antworten

8

Dies schlägt fehl, weil Ihr Kleiner-als-Vergleich distance_t::distance verwendet, den Sie nicht in findDistance :

einstellen %Vor%

std :: set verwendet operator== für nichts. Es verwendet nur operator< . Sie müssten also seine Logik ändern, um distance_t::id zu verwenden.

Wenn Sie nach id suchen möchten, ohne die Reihenfolge des Sets zu ändern, können Sie std :: find :

%Vor%

Dies wird Ihre operator== verwenden. Bedenken Sie, dass dies lineare Zeitkomplexität hat.

    
juanchopanza 23.08.2012, 07:46
quelle
4

Weil operator== überhaupt nicht aufgerufen wird. Vergleichen von Elementen ist wie folgt:

%Vor%

Mit anderen Worten, es verwendet operator< .

    
Kiril Kirov 23.08.2012 07:49
quelle
1

Da Sie findDistance.distance keinen Wert zugewiesen haben, ist das Ergebnis des weniger als Vergleichs nicht definiert.

Beachten Sie, dass Ihre Definitionen der Operatoren "Gleichheit" und "weniger als Vergleich" gefährlich sind, da es einfach ist, Instanzen von distance_t zu definieren, deren Ergebnis inkonsistent ist. Ein Beispiel sind zwei Instanzen mit derselben Entfernung, aber unterschiedlichen IDs.

    
Nicola Musatti 23.08.2012 07:49
quelle

Tags und Links