ホームページ > バックエンド開発 > C++ > C でカスタム型の `std::hash::operator()` を特殊化するにはどうすればよいですか?

C でカスタム型の `std::hash::operator()` を特殊化するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-30 00:35:14
オリジナル
394 人が閲覧しました

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

ユーザー定義型の std::hash::operator() を特殊化

ユーザー定義の順序付けされていないコンテナーを利用するにはstd::unowned_set などのキーの種類および std::unowned_map の場合、通常は、operator==(Key, Key) とハッシュ ファンクターを定義する必要があります。ただし、組み込み型の場合と同様に、そのような型にはデフォルトのハッシュ関数を利用することが望ましい場合があります。

C 標準を含むさまざまなリソースを調査すると、次のことが可能であることが明らかになります。 std::hash::operator() をユーザー定義型に特化します。次のコード スニペットは、そのような特殊化を例示しています。

namespace std {
  template <>
  inline size_t hash<X>::operator()(const X& x) const {
    return hash<int>()(x.id);
  }
}
ログイン後にコピー

ここで、提起された質問に答えてみましょう。

1.特殊化の合法性

std 名前空間への特殊化の追加は許可されているだけでなく、推奨されています。これにより、ユーザー定義型をサポートする標準機能の拡張が可能になります。

2.準拠バージョンの std::hash::operator()

std::hash::operator() を特殊化するための正しい構文は次のとおりです:

namespace std {
  template <>
  struct hash<X> {
    size_t operator()(const X& x) const {
      // Your custom hash function implementation
    }
  };
}
ログイン後にコピー

3.移植可能なソリューション

前に示した std::hash の特殊化には C 11 との互換性が必要ですが、コンパイラによって汎用的にサポートされていない可能性があります。移植性を高めるには、非標準の名前空間の使用を検討してください。例:

namespace ht {
  template <>
  struct hash<X> {
    // Your custom hash function implementation
  };
}
ログイン後にコピー

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

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