web-dev-qa-db-ja.com

unordered_mapの文字列用のC ++ハッシュ関数

C++には、標準ライブラリの文字列用のハッシュ関数がないようです。これは本当ですか?

任意のC++コンパイラで動作するunordered_mapのキーとして文字列を使用する実用的な例は何ですか?

33
MirroredFate

C++ STLは、さまざまな文字列クラスのテンプレート specializations of std::hashを提供します。 std::stringのキータイプとしてstd::unordered_mapを指定できます。

#include <string>
#include <unordered_map>

int main()
{
    std::unordered_map<std::string, int> map;
    map["string"] = 10;
    return 0;
}
28
awesoon

今日私はこれに遭遇しました(実際にはwstringではなくstringでしたが、同じことです):unordered_mapのキーとしてwstringを使用するとエラーが発生しますそのタイプで利用可能なハッシュ関数がないことについて。

私にとっての解決策は以下を追加することでした:

#include <string>

信じられないかもしれませんが、インクルードなしでは、まだwstring型を使用できましたが、明らかにハッシュのような補助機能はありませんでした。上記のインクルードを追加するだけで修正されました。

18
Dave

実際、std::hash<std::string>

ただし、別のハッシュ関数を使用する方法は次のとおりです。

struct StringHasher {
    size_t operator()(const std::string& t) const {
          //calculate hash here.
    }
}

unordered_map<std::string, ValueType, StringHasher>
14
RiaD

CustomTypeがあり、STLインフラストラクチャにプラグインしたい場合、これが可能です。

namespace std
{
//namespace tr1
//{
    // Specializations for unordered containers

    template <>
    struct hash<CustomType> : public unary_function<CustomType, size_t>
    {
        size_t operator()(const CustomType& value) const
        {
            return 0;
        }
    };

//} // namespace tr1

template <>
struct equal_to<CustomType> : public unary_function<CustomType, bool>
{
    bool operator()(const CustomType& x, const CustomType& y) const
    {
        return false;
    }
};

} // namespace std

次にstd::unordered_map<CustomType>を作成したい場合、STLはhashおよびequal_to関数を見つけますが、テンプレートでこれ以上何もする必要はありません。これが、順序付けられていないデータ構造をサポートするカスタムの等値比較子を作成する方法です。

8
John Leidegren

私の場合、それは本当に気晴らしでした。

私はconst&Xのハッシュを実装したタイプXを持っていて、どこかでそれを利用しました

std::unordered_map<const X, int> m_map;

それから、キーがX型である別のマップが必要でした。

std::unordered_map<X, int> map_x;

2番目の場合のconst[〜#〜] lack [〜#〜]に注意してください。

0
sergiol