【问题标题】:Accessing the intrinsic type hash functions for tr1/unordered_map访问 tr1/unordered_map 的内在类型哈希函数
【发布时间】:2011-04-11 19:24:06
【问题描述】:

我正在搞乱unordered_map 类模板,我想为我的类编写一个自定义散列器。它的文档提到为内部类型提供了默认散列函数。所以,如果你声明:

std::tr1::unordered_map<std::string, int> foo;

您会自动获得为您定义的哈希器。

这里有一个很好的例子,如果你想要一个自定义哈希函数,如何提供一个仿函数。

但是,如果我有一个复杂的类,它有一个 std::string 成员,我想将其用作插入/删除到 unordered_map 的键?我不想重写我自己的哈希器。我想利用已经为 std::string 类型编写的内容。

【问题讨论】:

    标签: c++ stl unordered-map


    【解决方案1】:

    默认哈希函子由std::hash&lt;T&gt; 提供,它返回size_t

    因此,您可以组合来自该类的多个成员的哈希,例如通过计算(std::hash&lt;T&gt;()(a) + prime * (std::hash&lt;T&gt;()(b) + prime * std::hash&lt;T&gt;()(c)))

    【讨论】:

    • 好的,我应该可以这样做:std::hash<:string>(mystring)?
    • 你需要实例化函子。 std::hash&lt;std::string&gt;()(mystring) 应该可以工作。
    • 好的,我尝试这样做,但我收到一条消息,“hash”不是“std”的成员。这是在 MacOS 上使用 g++ 4.2.1。如果您愿意,我可以提供样品的来源。
    • 使用 std::tr1::hash 或更新的编译器,在 std 命名空间中实现 C++0x。
    • 我的错误。我忽略了添加上面显示的额外括号。它在 gcc-4.2.1 的 std::tr1::hash 中可用。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2013-06-06
    • 2016-06-17
    • 1970-01-01
    相关资源
    最近更新 更多