順序付けされていないコンテナーのユーザー定義型の std::hash を特殊化する
std::unowned_set でカスタム キー タイプの使用を有効にするにはおよび std::unowned_map では、等価演算子とハッシュ関数の両方を提供する必要があります。これには通常、これらの演算子を実装するカスタム構造体またはクラスの定義が含まれます。ただし、コンパイラやライブラリによって提供される組み込み型と同様に、ユーザー定義型に対してデフォルトのハッシュ関数を使用する方が便利です。
C 標準ドラフト N3242 および Boost.Unowned によると、 、カスタム型用に std::hash を特殊化することが可能です。これには、std 名前空間に特殊化を追加することが含まれます。
namespace std { template <> inline size_t hash<X>::operator()(const X& x) const { return hash<int>()(x.id); } }
この例では、型 X のハッシュ関数は、型 int のハッシュ関数を使用するように特殊化されています。これは、X がメンバー変数 ID を持つことを前提としています。ハッシュ関数は特定のテンプレート引数の型に特化する必要があり、結果のハッシュ値はその型の等価演算子と一致する必要があることに注意することが重要です。
合法性と移植性:
namespace std { template <> struct hash<X> { size_t operator()(const X& x) const { return hash<int>()(x.id); } }; }
以上がC でユーザー定義型の `std::hash` を特殊化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。