43

似乎 C++ 在标准库中没有字符串的散列函数。这是真的?

什么是在 unordered_map 中使用字符串作为键的工作示例,可以与任何 c++ 编译器一起使用?

4

5 回答 5

36

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;
}
于 2013-03-24T06:52:00.823 回答
23

我今天遇到了这个问题(实际上是wstring, not string,但它是相同的交易):wstring在 an 中使用 as a key 会unordered_map生成一个关于该类型没有可用的哈希函数的错误。

我的解决方案是添加:

#include <string>

信不信由你,没有#include指令我仍然有wstring可用的类型,但显然没有像散列这样的辅助功能。只需添加上面的包含即可修复它。

于 2013-08-01T21:37:25.823 回答
16

Actually, there is std::hash<std::string>

But there it is how you can use another hash function:

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

然后,如果您想创建一个std::unordered_map<CustomType>STL 将找到hashequal_to功能,而无需您对模板做更多的事情。这就是我喜欢编写支持无序数据结构的自定义相等比较器的方式。

于 2013-03-24T07:03:33.457 回答
0

就我而言,这真的很分散注意力。

我有一个 X 类型,我为它实现了const& X的散列,并在某处使用它

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

然后我想要另一张地图,其中的钥匙属于该类型X并做了:

std::unordered_map<X, int> map_x;

注意第二种情况的LACKconst

于 2017-08-02T12:03:25.867 回答