【发布时间】:2015-06-23 14:00:26
【问题描述】:
我需要一个带有std::pair<T*, T*> 键的std::unordered_map,所以我“窃取”了以下代码:
template <class T>
inline void hash_combine(std::size_t & seed, const T & v)
{
std::hash<T> hasher;
seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
namespace std
{
template<typename S, typename T> struct hash<pair<S, T>>
{
inline size_t operator()(const pair<S, T> & v) const
{
size_t seed = 0;
::hash_combine(seed, v.first);
::hash_combine(seed, v.second);
return seed;
}
};
}
来自这个堆栈溢出answer。
它在带有 gcc 4.9.2 的 linux 机器上就像一个魅力。然而,在 Windows Visual Studio 2012 中,它在调用我的 unordered_map 的成员函数 find() 时崩溃。我的一个朋友在 windows 机器上调试了崩溃,他报告说它只在调试编译模式下通过给出“向量下标超出范围”而中断。
问:
- 发布的代码对于
std::pair<T*, T*>散列有效吗? - 是否有更健壮/更好的散列
std::pair<T*, T*>的方法? - 是什么导致了这种奇怪的行为?
P.S:非常抱歉没有发布mcve,但这是不可能的。
【问题讨论】:
-
为什么 mcve 不可能?未经测试如何确定 hash_map 的问题?也许你在其他地方破坏了记忆?
-
@Slava 这是不可能的,因为我对一个非常大的数据库有这种行为。因此,我无法发布 1.000.000 键示例。
-
首先,这是未定义的行为,正如 Yakk 在 cmets 中指出的那样。
-
@AntonSavin 很公平。
标签: c++ c++11 visual-studio-2012 unordered-map stdhash