std::unordered_map
キー aが必要だったstd::pair<T*, T*>
ので、次のコードを「盗みました」:
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;
}
};
}
このスタックオーバーフローの回答から。
gcc 4.9.2 を搭載した Linux マシンでは魅力的に動作します。ただし、Windows Visual Studio 2012 ではfind()
、my のメンバー関数を呼び出すとクラッシュしますunordered_map
。私の友人が Windows マシンでのクラッシュをデバッグし、「範囲外のベクトル添字」を与えることによって、デバッグ コンパイル モードでのみクラッシュすることを報告しました。
Q:
- 投稿されたコードはハッシュ a に対して有効です
std::pair<T*, T*>
か? - をハッシュするためのより堅牢な/より良い方法はあり
std::pair<T*, T*>
ますか? - この奇妙な動作の原因は何ですか?
PS: mcveを投稿しないことを深くお詫びしますが、投稿することは不可能です。