順序なしコンテナーのカスタム型の std::hash の特殊化
std::unowned_set や std::unowned_map などの順序なしコンテナーでは、サポートカスタム キー タイプでは、operator== とハッシュ ファンクターの両方を指定する必要があります。カスタム ハッシュ ファンクターを使用すると便利ですが、組み込み型と同様にカスタム型のデフォルト ハッシュを持つことも望ましいです。
これを実現するには、std::hash
合法性
std 名前空間内での特殊化の指定は許可されており、実際、場合によっては推奨されます。のようにthis.
コンプライアンス
std::hash を特殊化する正しい方法は、std 名前空間内でカスタム構造体を定義することです。次のコード スニペットは、正しい構文を示しています。
namespace std { template <> struct hash<Foo> { size_t operator()(const Foo &x) const { // Hashing logic for custom type } }; }
移植性
std::hash を特殊化するこの方法は、g や MSVC などの主要なコンパイラ間で移植可能です。
追加機能
std::hash とは別に、std::less、std::equal_to、std::swap などの他のファンクターをカスタム型に特化して機能を強化することもできます。
結論
専門化することでstd::hash を使用すると、順序付けされていないコンテナーのカスタム型にデフォルトのハッシュ関数を提供できるため、標準ライブラリ コンテナーでの使用がより便利になります。このアプローチは、C 11 標準に準拠しながら、合法的かつ移植可能です。
以上がC の順序付けされていないコンテナーのカスタム型にデフォルトのハッシュ関数を提供するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。