"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como implementar uma função de hash genérico para tuplas em coleções não ordenadas?

Como implementar uma função de hash genérico para tuplas em coleções não ordenadas?

Postado em 2025-03-26
Navegar:959

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

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 > { size_t operator () (std :: tuple const & tupla) const {...} };

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::tuple const& 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:

#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 { ... }
  };
}

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 , std :: hash >, std :: igual_to > > teste;

Tutorial mais recente Mais>

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