Heim > Backend-Entwicklung > C++ > Wie kann ich „std::hash' für meine benutzerdefinierten Typen in C spezialisieren?

Wie kann ich „std::hash' für meine benutzerdefinierten Typen in C spezialisieren?

Mary-Kate Olsen
Freigeben: 2024-12-10 03:19:16
Original
139 Leute haben es durchsucht

How Can I Specialize `std::hash` for My User-Defined Types in C  ?

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); }
}
Nach dem Login kopieren

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:

  • Ist es legal, eine Spezialisierung zu std hinzuzufügen? Ja, es ist legal, Spezialisierungen zu std hinzuzufügen, solange einer der beteiligten Typen benutzerdefiniert ist.
  • Welche Version von std::hash::operator() ist mit C 11 kompatibel? Der richtige Weg, std::hash in C 11 zu spezialisieren, besteht darin, eine Spezialisierung der Struktur std::hash zu definieren:
namespace std {
  template <> struct hash<X> {
    size_t operator()(const X& x) const { return hash<int>()(x.id); }
  };
}
Nach dem Login kopieren
  • Gibt es eine portable Möglichkeit, dies zu tun? Der oben bereitgestellte Code sollte auf verschiedene Compiler portierbar sein, die C 11 unterstützen.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage