C ++ shared_ptr Gleichheitsoperator

8

Der Gleichheitsoperator für shared_ptrs ist wie folgt definiert:

%Vor%

Das scheint kaputt zu sein. Wäre es nicht besser gewesen, die Gleichheit auf was a und b zu übertragen? zeigen auf? Oder wäre das eine unfaire Einschränkung für die Nutzer der Bibliothek? sie müssen einen Gleichheitsoperator zur Verfügung stellen)?

Wenn ich eine Map oder eine hash_table mit shared_ptrs habe, dann die aktuelle Definition macht Gleichheit unbrauchbar. Betrachten Sie zum Beispiel

%Vor%

Wollen wir nicht überprüfen, ob die ptrs für jeden int in m1 und m2 auf denselben Wert zeigen?

Ich kann meine eigene Gleichheit implementieren, indem ich m1, m2 ausflache (konstruiere Sätze von jedem, Dereferenzierung shared_ptrs auf dem Weg). Gibt es einen STL-Trick, um dies zu erreichen? oder eine andere Möglichkeit, Gleichheit in Gegenwart von shared_ptrs ordentlich zu testen?

    
user231536 19.04.2011, 21:33
quelle

3 Antworten

32

Es ist nicht kaputt, weil ein shared_ptr konzeptionell ein Zeiger ist, deshalb implementiert es zeigerweise Gleichheit. Wenn Sie zwei Zeiger auf Gleichheit testen, möchten Sie wissen, ob sie auf denselben Platz im Speicher zeigen.

    
Fred Foo 19.04.2011 21:41
quelle
6

Ich denke, dass der Vergleich von zwei shared_ptr Instanzen ungefähr so ​​nützlich ist wie der Vergleich zweier Zeiger. Wenn Sie einen std::map mit shared_ptr s oder einfachen alten Zeigern auf Objekte haben wollen, müssen Sie das Prädikat mit etwas überschreiben, das die spitzen Objekte in beiden Fällen vergleicht.

>

Wenn Sie zwei Maps vergleichen, möchten Sie wahrscheinlich die Version von std::equal verwenden, die ein Prädikat verwendet.

    
Tim Sylvester 19.04.2011 21:39
quelle
0

Ich bin gerade auf ein Problem gestoßen, bei dem ich beide Äquivalenztypen verwenden konnte. Ein ungeordneter Satz von shared_ptr, bei dem ich wollte, dass die Äquivalenz auf den Inhalten der zugespitzten Objekte basiert. Dies kann mit einer Template-Spezialisierung von Hash und einem überladenen == implementiert werden. Jetzt habe ich einen anderen Container, der auch diese Zeiger enthält (eine Kanteninzidenzliste von Arten), aber da wir bereits wissen, dass sie einzigartig sind, weil wir die Menge verwendet haben, können wir uns auf Zeigeräquivalenz verlassen. Obwohl die ursprüngliche Äquivalenz auch funktionieren würde, könnte es effizienter sein, sich im zweiten Fall nur auf die Zeigeräquivalenz zu verlassen - dies hängt von der Datenmenge ab, die in den verglichenen Instanzen vorhanden ist.

Also, um die Frage zu beantworten. Nein, es wäre nicht besser gewesen, denn wie Sie die gebotene Flexibilität nutzen, hängt davon ab, welches Problem gelöst wird.

    
jmcarter9t 05.07.2015 19:42
quelle

Tags und Links