ホームページ > バックエンド開発 > C++ > C でユーザー定義型の `std::hash` を特殊化するにはどうすればよいですか?

C でユーザー定義型の `std::hash` を特殊化するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-10 03:19:16
オリジナル
170 人が閲覧しました

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

順序付けされていないコンテナーのユーザー定義型の 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 を持つことを前提としています。ハッシュ関数は特定のテンプレート引数の型に特化する必要があり、結果のハッシュ値はその型の等価演算子と一致する必要があることに注意することが重要です。

合法性と移植性:

  • 標準疾患に特殊化を追加することは合法ですか?はい、関係する型の 1 つがユーザー定義である限り、std に特殊化を追加することは合法です。
  • C 11 に準拠している std::hash::operator() のバージョンはどれですか? C 11 で std::hash を特殊化する正しい方法は、構造体 std::hash:
namespace std {
  template <> struct hash<X> {
    size_t operator()(const X& x) const { return hash<int>()(x.id); }
  };
}
ログイン後にコピー
  • の特殊化を定義することです。それを行う移植可能な方法はありますか?上記のコードは、C 11 をサポートするさまざまなコンパイラ間で移植可能である必要があります。

以上がC でユーザー定義型の `std::hash` を特殊化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート