Spezialisierung von std::hash für benutzerdefinierte Typen in ungeordneten Containern
Um die Verwendung benutzerdefinierter Schlüsseltypen in std::unordered_set zu ermöglichen und std::unordered_map muss man sowohl einen Gleichheitsoperator als auch eine Hash-Funktion bereitstellen. Dies beinhaltet normalerweise die Definition einer benutzerdefinierten Struktur oder Klasse, die diese Operatoren implementiert. Es wäre jedoch bequemer, eine Standard-Hash-Funktion für benutzerdefinierte Typen zu verwenden, ähnlich den integrierten Typen, die vom Compiler und der Bibliothek bereitgestellt werden.
Gemäß C Standard Draft N3242 und Boost.Unordered ist es möglich, std::hash auf einen benutzerdefinierten Typ zu spezialisieren. Dazu gehört das Hinzufügen einer Spezialisierung zum std-Namespace:
namespace std { template <> inline size_t hash<X>::operator()(const X& x) const { return hash<int>()(x.id); } }
In diesem Beispiel ist die Hash-Funktion für Typ X auf die Verwendung der Hash-Funktion für Typ int spezialisiert, die davon ausgeht, dass X eine Mitgliedsvariablen-ID hat. Es ist wichtig zu beachten, dass die Hash-Funktion auf den spezifischen Vorlagenargumenttyp spezialisiert sein muss und der resultierende Hash-Wert mit dem Gleichheitsoperator für den Typ übereinstimmen muss.
Legalität und Portabilität:
namespace std { template <> struct hash<X> { size_t operator()(const X& x) const { return hash<int>()(x.id); } }; }
Das obige ist der detaillierte Inhalt vonWie kann ich „std::hash' für meine benutzerdefinierten Typen in C spezialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!