在unordered_map串C ++哈希函数(C++ Hash function for stri

2019-08-17 23:01发布

看来,如果C ++没有在标准库串的哈希函数。 这是真的?

什么是使用字符串作为一个unordered_map将与任何C ++编译器是一个关键的工作的例子吗?

Answer 1:

C ++ STL提供的模板特化的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;
}


Answer 2:

我跑进今日(实际上wstring ,不是string ,但它是相同的交易):使用wstring作为一个关键unordered_map产生约没有哈希函数是用于该类型的错误。

对我来说,解决办法是补充:

#include <string>

不管你信不信,不包括我仍然有可用的wstring类型,但显然不是辅助功能,如哈希值。 简单地将包括上面固定它。



Answer 3:

其实,有std::hash<std::string>

但是,它是你可以使用另一种散列函数:

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

unordered_map<std::string, ValueType, StringHasher>


Answer 4:

如果你有一个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会发现hashequal_to功能,您无需做任何更多与模板。 这是我喜欢写支持无序的数据结构,我的自定义相等比较。



Answer 5:

在我的情况真的很分心。

我有一个X型对于我实现的利用它的地方,与散列为常量&X

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

然后,我想有另一个地图,关键是类型的X和做的:

std::unordered_map<X, int> map_x;

注意缺乏 const的第二种情况。



文章来源: C++ Hash function for string in unordered_map