hashing - set string c++
error para la funciĆ³n hash del par de ints (1)
Desafortunadamente, este programa tiene un comportamiento indefinido. C ++ 11 §17.6.4.2.1:
Un programa puede agregar una especialización de plantilla para cualquier plantilla de biblioteca estándar al espacio de nombre std solo si la declaración depende de un tipo definido por el usuario y la especialización cumple con los requisitos de biblioteca estándar para la plantilla original y no está explícitamente prohibida.
hash<pair<int,int>>
depende únicamente de los tipos de biblioteca primitiva y estándar. Esto se soluciona fácilmente definiendo su clase hash fuera del espacio de nombres std
, y usando ese hash explícitamente en su declaración de mapa:
struct pairhash {
public:
template <typename T, typename U>
std::size_t operator()(const std::pair<T, U> &x) const
{
return std::hash<T>()(x.first) ^ std::hash<U>()(x.second);
}
};
class abc {
std::unordered_map<std::pair<int,int>, int, pairhash> rules;
};
EDITAR: He usado xor para combinar los hashes de los miembros de la pareja porque soy perezoso, pero para un uso serio xor es una función de combinación de hash bastante mala .
Tengo la siguiente clase con un miembro unordered_map
y una función hash definida para el pair<int,int>
class abc
{public :
unordered_map < pair<int,int> , int > rules ;
unsigned nodes;
unsigned packet ;
};
namespace std {
template <>
class hash < std::pair< int,int> >{
public :
size_t operator()(const pair< int, int> &x ) const
{
size_t h = std::hash<int>()(x.first) ^ std::hash<int>()(x.second);
return h ;
}
};
}
Pero estoy recibiendo los siguientes errores:
error: invalid use of incomplete type ‘struct std::hash<std::pair<int, int> >
error: declaration of ‘struct std::hash<std::pair<int, int> >
error: type ‘std::__detail::_Hashtable_ebo_helper<1, std::hash<std::pair<int, int> >, true>’ is not a direct base of ‘std::__detail::_Hash_code_base<std::pair<int, int>, std::pair<const std::pair<int, int>, int>, std::__detail::_Select1st, std::hash<std::pair<int, int> >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, true>’