Maison >développement back-end >C++ >Pourquoi ne puis-je pas utiliser `std::pair` comme clé dans un `std::unordered_map` et comment puis-je y remédier ?

Pourquoi ne puis-je pas utiliser `std::pair` comme clé dans un `std::unordered_map` et comment puis-je y remédier ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-07 02:57:12924parcourir

Why Can't I Use `std::pair` as the Key in an `std::unordered_map` and How Do I Fix It?

Pourquoi ne puis-je pas compiler une carte unordered_map avec une paire comme clé ?

Le problème rencontré ici est l'absence d'une fonction de hachage appropriée pour le type de clé. Pour résoudre ce problème, fournissez une fonction de hachage personnalisée pour la clé de paire. Voici un exemple :

#include <unordered_map>
#include <functional>
#include <string>
#include <utility>

struct pair_hash {
    template <class T1, class T2>
    std::size_t operator() (const std::pair<T1,T2>& p) const {
        auto h1 = std::hash<T1>{}(p.first);
        auto h2 = std::hash<T2>{}(p.second);

        return h1 ^ h2;  // Simple example, for better results use boost.hash_combine
    }
};

using Vote = std::pair<std::string, std::string>;
using Unordered_map = std::unordered_map<Vote, int, pair_hash>;

Avec cette fonction de hachage personnalisée, vous pouvez désormais créer une carte unordered_map sans erreurs de compilation. Notez que la fonction de hachage fournie ici est simpliste à des fins de démonstration. Pour des scénarios réels, envisagez d'utiliser des techniques telles que boost.hash_combine de Boost pour améliorer la qualité de votre fonction de hachage.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn