função de hash genérico para tuplas em coleções não ordenadas
o std :: não -ordered_map e std :: uncomered_set contêineres fornecem pesquisa e inserção com base em seus elementos e hashed. No entanto, o uso de tuplas como chaves nessas coleções sem definir uma função de hash personalizada pode levar a um comportamento inesperado.
struct std :: hash
Embora essa abordagem funcione, pode ser tedioso definir funções de hash para cada tipo de tupla usado. Para automatizar isso, uma função de hash genérico pode ser implementada da seguinte forma:
template struct std::hash<:tuple int>> { size_t operator()(std::tupleconst& tuple) const { ... } };
Esta função aproveita o nome de nome dependente do argumento (ADL) para permitir que o compilador selecione automaticamente a implementação correta do hash com base no tipo de tupla. Para uma solução compatível com padrões, um espaço para nome personalizado pode ser criado e usado para definir a função de hash:
#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 { ... } }; }
Ao usar esta solução, a coleção não ordenada deve fazer referência explicitamente a implementação de hash personalizada da seguinte forma:
unorded_set
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3