Heim > Backend-Entwicklung > C++ > Wie kann ich „std::hash::operator()' für benutzerdefinierte Typen in C spezialisieren?

Wie kann ich „std::hash::operator()' für benutzerdefinierte Typen in C spezialisieren?

Susan Sarandon
Freigeben: 2024-11-30 00:35:14
Original
408 Leute haben es durchsucht

How Can I Specialize `std::hash::operator()` for Custom Types in C  ?

Spezialisierung von std::hash::operator() für benutzerdefinierte Typen

Um ungeordnete Container mit benutzerdefinierten zu nutzen Schlüsseltypen wie std::unordered_set und std::unordered_map müssen Sie normalerweise „operator==(Key, Key)“ und einen Hash-Funktor definieren. Es kann jedoch vorzuziehen sein, für solche Typen eine Standard-Hash-Funktion zu verwenden, wie dies bei integrierten Typen der Fall ist.

Bei der Untersuchung verschiedener Ressourcen, einschließlich des C-Standards, wird deutlich, dass dies möglich ist spezialisieren Sie std::hash:operator() für benutzerdefinierte Typen. Der folgende Codeausschnitt veranschaulicht eine solche Spezialisierung:

namespace std {
  template <>
  inline size_t hash<X>::operator()(const X& x) const {
    return hash<int>()(x.id);
  }
}
Nach dem Login kopieren

Befassen wir uns nun mit den aufgeworfenen Fragen:

1. Rechtmäßigkeit der Spezialisierung

Das Hinzufügen von Spezialisierungen zum std-Namespace ist nicht nur erlaubt, sondern wird auch gefördert. Es ermöglicht die Erweiterung von Standardfunktionen zur Unterstützung benutzerdefinierter Typen.

2. Kompatible Version von std::hash:operator()

Die korrekte Syntax zum Spezialisieren von std::hash::operator() lautet wie folgt:

namespace std {
  template <>
  struct hash<X> {
    size_t operator()(const X& x) const {
      // Your custom hash function implementation
    }
  };
}
Nach dem Login kopieren

3. Tragbare Lösung

Die zuvor gezeigte std::hash-Spezialisierung erfordert C 11-Kompatibilität, die von Compilern möglicherweise nicht allgemein unterstützt wird. Erwägen Sie für eine bessere Portabilität die Verwendung eines nicht standardmäßigen Namespace, z. B.:

namespace ht {
  template <>
  struct hash<X> {
    // Your custom hash function implementation
  };
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann ich „std::hash::operator()' für benutzerdefinierte 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