新しいC++11標準には、順序付けされていないコンテナーがあります。特に、(デフォルトのハッシュ関数)に基づいた場所にをstd::unordered_map<Key, Value>
格納します。同様に、に基づいた場所にキーを格納します。std::pair<Key, Value>
std::hash<Key>
std::unordered_set<Key>
std::hash<Key>
私の質問は、キーと値のペアの値のみをに基づいた場所に格納するにはどうすればよいstd::hash<Key>
ですか?これは、完全なハッシュ関数を使用する場合、つまり、異なるキーが異なるハッシュインデックスにマップされる場合に役立ちます(したがって、衝突の解決は必要ありません)。
unordered_setはキーのみを使用し、unordered_mapはキーと値の両方を使用するため、新しいC++11標準のunorderedSTLコンテナーではそのようなカスタマイズは許可されていないようです。既存のSTLコンテナからそのようなデータ構造を取得するための良い方法は何でしょうか?
より一般的には、キーの署名を表すタイプはどこにあるかにstd::pair<T, Value>
基づいて、をどのように場所に格納できますか?たとえば、Keyが大規模なデータ構造である場合、64ビットのハッシュキーを計算し、これを2つの32ビット部分に分割します。上位32ビットとValueがaを形成し、下位32ビットがこの場所を決定します。ペアが保存されます。std::hash<Key>
T
std::pair<uint32_t, Value>
これが役立つアプリケーションは、たとえばコンピュータチェスです。この場合、キータイプとしての位置(一部のプログラムでは数キロバイト)が64ビットキーにハッシュされ、そのうち上位32ビットと一部の検索関連情報のみが値として使用されます。タイプはstd::pair
、ハッシュキーの下位32ビットに基づく場所に(通常は合計16バイトのみ)格納されます。