C ++ 11 unordered_set mit std :: owner_less-like Hashing

9

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.

%Vor%

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.

    
Sebastian Nowak 13.07.2015, 07:58
quelle

2 Antworten

2

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.

    
Serge Rogatch 13.07.2015, 08:41
quelle
0

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 std::shared_ptr (Hashing des Ergebnisses von get() ) sollte ausreichen. 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.

    
Lorenzo Gatti 13.07.2015 08:24
quelle