1

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:

  1. 投稿されたコードはハッシュ a に対して有効ですstd::pair<T*, T*>か?
  2. をハッシュするためのより堅牢な/より良い方法はありstd::pair<T*, T*>ますか?
  3. この奇妙な動作の原因は何ですか?

PS: mcveを投稿しないことを深くお詫びしますが、投稿することは不可能です。

4

1 に答える 1