Generischer Hash für Tupel in unordered_map / unordered_set
Warum nicht std::unordered_map<tuple<int, int>, string>
nur
die Arbeit out of the box?
Es ist mühsam, Sie zu haben, um zu definieren, eine hash-Funktion für tuple<int, int>
z.B.
template<> struct do_hash<tuple<int, int>>
{ size_t operator()(std::tuple<int, int> const& tt) const {...} };
Gebäude eine ungeordnete Karte mit Tupel als Schlüssel (Matthieu M.) zeigt, wie
automatisieren Sie diese für boost::tuple
. Gibt es trotzdem, dies zu tun für c++0x-Tupel ohne mithilfe von variadic templates?
Sicherlich sollte dies in den standard 🙁
InformationsquelleAutor der Frage Leo Goodstadt | 2011-08-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies funktioniert auf gcc 4.5, dass alle c++0x-Tupel mit standard-hashable Typen, die Mitglieder
unordered_map
undunordered_set
ohne weiteres.(Ich habe den code in eine header-Datei und fügen Sie einfach.)
Die Funktion hat, zu Leben im std-namespace, so dass es abgeholt wird von
argument-dependent name lookup (ADL).
Gibt es eine einfachere Lösung?
Standard-Konformen code
Yakk weist darauf hin, dass die Spezialisierung Dinge im std-namespace ist tatsächlich ein Undefiniertes Verhalten. Wenn Sie möchten, haben eine Standard-konforme Lösung, dann müssen Sie zu bewegen, alle dieser code in Ihrem eigenen namespace, und geben eine Vorstellung von ADL die Suche nach den richtigen hash-Implementierung automatisch. Statt :
Benötigen Sie:
wo
hash_tuple
ist in Ihrem eigenen Namensraum, anstattstd::
.Um dies zu tun, müssen Sie zunächst erklären, eine hash-Implementierung innerhalb der
hash_tuple
namespace. Dies wird uns alle nicht Tupel-Typen auf denstd::hash
:Stellen Sie sicher, dass
hash_combine
Anrufehash_tuple::hash
und nichtstd::hash
Dann sind alle anderen vorherigen code, sondern legte es in
namespace hash_tuple
und nichtstd::
InformationsquelleAutor der Antwort Leo Goodstadt
InformationsquelleAutor der Antwort Вова
In meinem C++0x draft
20.8.15
sagt hash ist spezialisiert für built-in Typen (auch Zeiger, aber scheint nicht zu bedeuten, dereferenzieren Sie). Es scheint auch so zu sein, spezialisiert fürerror_code
bitset<N>
unique_ptr<T, D>
shared_ptr<T>
typeindex
string
u16string
u32string
wstring
vector<bool, Allocator>
undthread::id
. (herrlichen Liste!)Habe ich nicht verwendet C++0x variadics, so dass meine Formatierung ist wohl Weg, aber etwas in diese Richtung funktionieren könnte, für alle Tupel.
Diese version tatsächlich kompiliert und ausgeführt wird
Yakk hat beobachtet, dass sich spezialisiert
std::hash
direkt technisch nicht erlaubt, da wir sind spezialisiert eine standard-library-Vorlage einer Erklärung, dass nicht nicht abhängig von einem benutzerdefinierten Typ.InformationsquelleAutor der Antwort Mooing Duck