I just me encontré un poco sorprendido al no poder utilizar simplemente un¿No hay especializaciones de std :: hash para contenedores estándar?
std::unordered_set<std::array<int, 16> > test;
porque no parece ser una especialización std::hash
para std::array
s. ¿Porqué es eso? ¿O simplemente no lo encontré? Si no hay ninguno, ¿se puede simplificar el siguiente intento de implementación?
namespace std
{
template<typename T, size_t N>
struct hash<array<T, N> >
{
typedef array<T, N> argument_type;
typedef size_t result_type;
result_type operator()(const argument_type& a) const
{
hash<T> hasher;
result_type h = 0;
for (result_type i = 0; i < N; ++i)
{
h = h * 31 + hasher(a[i]);
}
return h;
}
};
}
Realmente siento que esto debería de alguna manera ser parte de la biblioteca estándar.
Realmente no hay uno, solo 'std :: string' y amigos tienen ese privilegio. ¿Sería realmente impopular si dijera que el esfuerzo de C++ por arrastrarse hacia el estado actual del arte en términos de estructuras de datos estándar todavía no ha hecho todo el trabajo? En realidad, no hay ninguna especialización '' hash' requerida para las plantillas (y que a su vez requeriría que sus argumentos de plantilla sean aptos para ser procesados). Las únicas especializaciones requeridas son para tipo incorporado y cuatro clases de cuerdas de hormigón. Entonces sospecho que una línea fue dibujada allí. –
@Steve: ¿Cuáles 4 clases de cuerdas concretas? – fredoverflow
'cadena',' u16string', 'u32string',' wstring' (21.6 en C++ 11). Yo diría que 'pair' y' tuple' deberían ser los siguientes objetivos de mayor prioridad, seguidos de los contenedores estándar, seguidos por un hash predeterminado para cualquier tipo agregado compuesto por miembros hashable. –