unordered_map :: find with key std :: par de punteros con bloqueos hash personalizados en VS2012
Necesitaba unstd::unordered_map
con llave astd::pair<T*, T*>
así que "robé" el siguiente código:
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;
}
};
}
de este stackoverflowresponder.
Funciona de maravilla en máquinas Linux con gcc 4.9.2. Sin embargo, en Windows Visual Studio 2012 se bloquea al llamar a la función miembrofind()
de miunordered_map
. Un amigo mío depuró el bloqueo en la máquina de Windows e informó que solo se rompe en el modo de compilación de depuración al dar "subíndice de vector fuera de rango".
std::pair<T*, T*>
?¿Existe una forma más robusta / mejor de hashing unstd::pair<T*, T*>
?¿Qué causa este comportamiento extraño?PD: lo siento mucho por no publicar unmcve Pero es imposible hacerlo.