unordered_map :: find with key std :: par de ponteiros com falhas de hash personalizadas no VS2012
Eu precisava de umstd::unordered_map
com a tecla astd::pair<T*, T*>
então eu "roubei" o seguinte 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;
}
};
}
deste stackoverflowresponda.
Funciona como um encanto em máquinas Linux com o gcc 4.9.2. No entanto, no Windows Visual Studio 2012, ele trava ao chamar a função de membrofind()
do meuunordered_map
. Um amigo meu depurou a falha na máquina Windows e relatou que ela quebra apenas no modo de compilação de depuração, fornecendo "vetor subscrito fora do intervalo".
std::pair<T*, T*>
?Existe uma maneira mais robusta / melhor de fazer hash de umstd::pair<T*, T*>
?O que causa esse comportamento estranho?P.S: Desculpe profundamente por não postar ummcve mas é impossível fazer isso.