"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo implementar una función hash genérica para tuplas en colecciones desordenadas?

¿Cómo implementar una función hash genérica para tuplas en colecciones desordenadas?

Publicado el 2025-04-15
Navegar:155

How to Implement a Generic Hash Function for Tuples in Unordered Collections?

Función hash genérica para tuplas en colecciones no ordenadas

los contenedores std :: unordened_map y std :: unordened_set proporcionan una mirada eficiente y la inserción de elementos basados ​​en sus valores hashed. Sin embargo, el uso de tuplas como claves en estas colecciones sin definir una función de hash personalizada puede conducir a un comportamiento inesperado.

para rectificar esto, un enfoque es definir manualmente una función hash para el tipo de tupla específico, como:

template
struct std::hash<:tuple int>> {
  size_t operator()(std::tuple const& tuple) const { ... }
};

Mientras este enfoque funciona, puede ser tedioso definir funciones hash para cada tipo de tupla utilizado. Para automatizar esto, una función hash genérica se puede implementar de la siguiente manera:

#include 

namespace std {
  namespace {

    // Code derived from Boost
    template
    inline void hash_combine(std::size_t& seed, T const& v) { ... }

    // Recursive template code from Matthieu M.
    template::value - 1>
    struct HashValueImpl { ... };

  }

  template
  struct hash<:tuple>> {
    size_t operator()(std::tuple const& tuple) const { ... }
  };
}

Esta función aprovecha la búsqueda de nombre dependiente del argumento (ADL) para permitir que el compilador seleccione automáticamente la implementación de hash correcta basada en el tipo de tuple.

SOLUCIÓN CONFORMANTE ESTÁNDAR

. Para una solución compatible con estándares, se puede crear y utilizar un espacio de nombres personalizado para definir la función hash:

Namespace my_hash { // reenviar tipos de no tupla al std :: hash plantilla struct hash {...}; // Proporcionar el hash optimizado para tuplas plantilla struct hash > {...}; }
namespace my_hash {

  // Forward non-tuple types to the std::hash
  template
  struct hash { ... };

  // Provide the optimized hash for tuples
  template
  struct hash<:tuple>> { ... };

}
Al usar esta solución, la colección no ordenada debe hacer referencia explícitamente a la implementación de hash personalizado de la siguiente manera:

unordered_set , std :: hash >, std :: igual_to > > prueba;
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3