43

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

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

4

5 に答える 5

36

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

#include <string>
#include <unordered_map>

int main()
{
    std::unordered_map<std::string, int> map;
    map["string"] = 10;
    return 0;
}
于 2013-03-24T06:52:00.823 に答える
23

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

私にとっての解決策は、次を追加することでした。

#include <string>

信じられないかもしれませんが、#includeディレクティブがなくても、wstringタイプは使用可能でしたが、ハッシュのような補助関数ではないようです。上記のインクルードを追加するだけで修正されました。

于 2013-08-01T21:37:25.823 に答える
16

実はstd::hash<std::string>

しかし、別のハッシュ関数を使用する方法があります。

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

unordered_map<std::string, ValueType, StringHasher>
于 2013-03-24T06:34:54.903 に答える
8

を持っていて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

次に、たとえばSTLを作成する場合は、テンプレートを使用して何もしなくても、STLがと関数std::unordered_map<CustomType>を検索します。これが、順序付けされていないデータ構造をサポートするカスタム等式比較子を作成する方法です。hashequal_to

于 2013-03-24T07:03:33.457 に答える
0

私の場合、それは本当に気を散らすものでした。

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

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

次に、キーがそのタイプXであり、実行した別のマップが必要でした。

std::unordered_map<X, int> map_x;

2番目のケースのの欠如に注意してください。const

于 2017-08-02T12:03:25.867 に答える