我正在尝试创建一个 unordered_map
来映射整数对:
#include <unordered_map>
using namespace std;
using Vote = pair<string, string>;
using Unordered_map = unordered_map<Vote, int>;
我有一堂课,我已将 Unordered_map
声明为私人成员。
但是,当我尝试编译它时出现以下错误:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/type_traits:948:38:未定义模板’std::__1::hash,std::__1的隐式实例化: :basic_string > >’
如果我使用像 map<pair<string, string>, int>
这样的常规地图而不是 unordered_map
,我不会收到此错误。
在无序地图中不能使用 pair
作为键吗?
原文由 Marre 发布,翻译遵循 CC BY-SA 4.0 许可协议
您需要为您的密钥类型提供合适的哈希函数。一个简单的例子:
这将起作用,但没有最好的哈希属性† 。您可能想查看类似
boost.hash_combine
的内容,以便在组合哈希时获得更高质量的结果。在 这个答案 中也更详细地讨论了这一点——包括上述来自 boost 的解决方案。对于实际使用:Boost 还提供了函数集
hash_value
已经为std::pair
以及std::tuple
和大多数标准容器提供了哈希函数。†更准确地说,它会产生太多的碰撞。例如,每个对称对将散列为 0,而仅通过排列不同的对将具有相同的散列。这对于您的编程练习可能很好,但可能会严重损害现实世界代码的性能。