Saltar al contenido

par emparejar como key del problema unordered_map

Necesitamos tu ayuda para extender nuestros posts referente a las ciencias informáticas.

Solución:

Esto sucede porque no hay especialización para std::tr1::hash con Key = std::pair. Debes especializarte std::tr1::hash con Key = std::pair antes de declarar tr1::unordered_map h;. Esto sucede porque std no sé cómo hash un pair.

A continuación se muestra un ejemplo de cómo especializarse std::tr1::hash<>

template <>
struct std::tr1::hash > 
public:
        size_t operator()(std::pair x) const throw() 
             size_t h = SOMETHING;//something with x   
             return h;
        
;

Unordered Map no contiene una función hash para un par, por lo que si queremos codificar un par, debemos proporcionarle explícitamente una función hash que pueda codificar un par.

Si queremos usar par como key a unordered_map, hay 2 formas de hacerlo:

  1. Definir especialización para std::hash
typedef std::pair pair;

struct pair_hash

    template 
    std::size_t operator() (const std::pair &pair) const
    
        return std::hash()(pair.first) ^ std::hash()(pair.second);
    
;

int main()

    std::unordered_map unordered_map =
    
        "C++", "C++11", 2011,
        "C++", "C++14", 2014,
        "C++", "C++17", 2017,
        "Java", "Java 7", 2011,
        "Java", "Java 8", 2014,
        "Java", "Java 9", 2017
    ;

    for (auto const &entry: unordered_map)
    
        auto key_pair = entry.first;
        std::cout << "" << key_pair.first << "," << key_pair.second << ", "
                  << entry.second << 'n';
    

    return 0;

  1. Uso de la biblioteca Boost Otra buena manera es usar boost::hash de Boost.funcional que se puede usar para hacer hash de enteros, flotantes, punteros, cadenas, matrices, pares y los contenedores STL.
#include 
#include 
#include 
#include 

typedef std::pair pair;

int main()

    std::unordered_map> unordered_map =
    
        "C++", "C++11", 2011,
        "C++", "C++14", 2014,
        "C++", "C++17", 2017,
        "Java", "Java 7", 2011,
        "Java", "Java 8", 2014,
        "Java", "Java 9", 2017
    ;

    for (auto const &entry: unordered_map)
    
        auto key_pair = entry.first;
        std::cout << "" << key_pair.first << "," << key_pair.second << ", "
                  << entry.second << 'n';
    

    return 0;

valoraciones y comentarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada.