Um benutzerdefinierte Typen als Schlüssel in ungeordneten Containern wie std::unordered_set und std:: zu verwenden unordered_map ist es notwendig, den Gleichheitsoperator (Operator==) und einen Hash-Funktor zu implementieren. Ein bequemerer Ansatz wäre, eine Standard-Hash-Funktion speziell für den benutzerdefinierten Typ zu erstellen, analog zu den integrierten Hash-Funktionen, die für Standardtypen bereitgestellt werden.
Bei der Untersuchung verschiedener Ressourcen scheint es, dass die Spezialisierung auf std::hash< ;X>::operator() für einen benutzerdefinierten Typ X ist tatsächlich machbar. Es stellen sich jedoch folgende Fragen:
Der C-Standard erlaubt und fördert ausdrücklich das Hinzufügen von Spezialisierungen zum Standard-Namespace, vorausgesetzt, dass einer der beteiligten Typen benutzerdefiniert ist. Daher kann die erste Frage mit Ja beantwortet werden.
Die richtige und bevorzugte Methode zur Spezialisierung der Hash-Funktion in C 11 besteht darin, eine Struktur innerhalb des std-Namensraums wie folgt zu definieren :
namespace std { template <> struct hash<Foo> { size_t operator()(const Foo & x) const { // Implementation of the hash function for type Foo } }; }
Diese Syntax gewährleistet die Einhaltung des C 11-Standards und ermöglicht die Spezifikation benutzerdefinierter Hash-Funktionen für benutzerdefinierte Typen.
Leider gibt es keine plattformunabhängige Methode, um std::hash
Das obige ist der detaillierte Inhalt vonWie erweitert man die Standard-Hash-Funktion für benutzerdefinierte Typen in ungeordneten C-Containern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!