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?
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.
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.
Tags und Links c++ map equality shared-ptr