【发布时间】:2011-06-18 07:44:38
【问题描述】:
我实现了一个搜索缓存结果,它包含 State 类型的键(一个具有 7 个短整数的类)和 Score 类型的值(一个 3 个双精度值的类)。使用 unordered_map 至少比 map 慢 20 倍。为什么?
编辑:该死!我的哈希函数是
namespace std {
size_t hash<State>::operator()(State const& s) const {
size_t retval = hash<short>()(s.s[0]);
for (int i = 1; i < R; i += 2) { // 1 3 5
int x = (static_cast<int>(s.s[i + 1]) << 16)
+ (static_cast<int>(s.s[i]));
hash_combine(retval, x);
}
}
}
我忘了return retval,所以一切都在碰撞!我希望 unordered_map 有一个 hash_function_quality() 函数来报告平均碰撞次数。
【问题讨论】:
-
intel i5、gcc、60 万次插入和查找
-
你在使用带有 unordered_map 的哈希函数吗?
-
是的。如果我不这样做,它会起作用吗?
-
对于 60 万个插入,我可能仍然会使用
std::map。访问一个元素只需大约 19 次操作。任何计算机都可以快速执行 19 项操作。甚至是 1950 年代的原型计算机。 -
实际上是UB掉了一个返回值函数的末尾。 Gcc 确实有一个警告,-Wreturn-type,它包含在 -Wall 中。
标签: c++ dictionary stl unordered-map