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::tupleconst& 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:
#includenamespace 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
namespace my_hash { // Forward non-tuple types to the std::hash templateAl 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:struct hash { ... }; // Provide the optimized hash for tuples template struct hash<:tuple>> { ... }; }
unordered_set , std :: hash
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