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
Susan SarandonOriginal
2024-11-30 00:35:14466Durchsuche

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);
  }
}

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
    }
  };
}

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
  };
}

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!

Stellungnahme:
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