Ich verwende eine externe Netzwerkbibliothek, die einige magische Strukturen zurückgibt, die geöffnete Sockets darstellen, und die Dokumente sagen, dass sie beim Einfügen in STL-Container mit std::owner_less
verglichen werden sollten.
Allerdings möchte ich stattdessen unordered_map
verwenden. Wie kann ich es tun? std::owner_less
ist ein Komparator und für eine Hash-Map nutzlos. Wenn Sie den Quellcode eingraben, scheint MagicStructure
ein typedef für std::shared_ptr
zu sein.
Leider müssen Sie ein map
verwenden und unordered_map
für ein solches Szenario nicht verwenden: Ссылка
Hash-Unterstützung für die eigentümerbasierte Äquivalenzrelation kann nicht sein bereitgestellt von einer benutzerdefinierten Weise, weil Informationen über Die Besitzerteilung ist für Benutzer überhaupt nicht verfügbar. deshalb, die Die einzige Möglichkeit, eine eigentümerbasierte Hash-Unterstützung bereitzustellen, besteht darin, sie anzubieten aufdringlich durch die Standardbibliothek.
Mit anderen Worten, es wird gespeichert (von get()
zurückgegeben) und Besitzerzeiger (der gelöscht wird, wenn der Referenzzähler 0 erreicht) in shared_ptr
: Ссылка . Um den eigenen Zeiger in einem unordered_map
zu verwenden, benötigen Sie eigene zeigerbasierte Operationen hash()
und equals()
. Aber sie sind nicht in STL zur Verfügung gestellt. Und Sie können sie nicht selbst implementieren (ohne shared_ptr
neu zu implementieren und die Definition von MagicStructure
zu ändern), da der eigene Zeiger nicht von shared_ptr
verfügbar gemacht wird.
Die Reihenfolge von std::owner_less
kann leicht in einen Gleichheitsvergleich übernommen werden (a und b sind gleich, wenn keiner dem anderen vorangeht).
Die Standard-Hashing-Implementierung für Nicht, wenn zwei Zeiger auf dasselbe Objekt nicht garantiert denselben Wert von% zurückgeben. co_de%, was in diesem speziellen Fall allgemein möglich und plausibel ist. std::shared_ptr
(Hashing des Ergebnisses von get()
) sollte ausreichen.
Tags und Links c++ c++11 stl shared-ptr unordered-map