unordered_map :: find with key std :: Zeigerpaar mit benutzerdefinierten Hash-Abstürzen in VS2012

Ich brauchte einstd::unordered_map mit Taste astd::pair<T*, T*> Also habe ich den folgenden Code "gestohlen":

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;
    }
  };
}

von diesem StapelüberlaufAntworte.

Es funktioniert wie ein Zauber auf Linux-Rechnern mit gcc 4.9.2. In Windows Visual Studio 2012 stürzt es jedoch ab, wenn die Member-Funktion @ aufgerufen wirfind() von meinenunordered_map. Ein Freund von mir hat den Absturz auf einem Windows-Computer behoben und berichtet, dass er nur im Debug-Kompilierungsmodus funktioniert, indem er "Vektor-Index außerhalb des gültigen Bereichs" angibt.

Q:Ist der eingegebene Code gültig für das Hashing einesstd::pair<T*, T*>? Gibt es eine robustere / bessere Art, ein @ zu haschestd::pair<T*, T*>?Was verursacht dieses seltsame Verhalten?

P.S: Es tut mir sehr leid, dass ich kein @ gepostet hab mcve aber das ist unmöglich.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage