Maison >développement back-end >C++ >Pourquoi les clés `char*` échouent-elles dans `std::map` et comment puis-je y remédier ?

Pourquoi les clés `char*` échouent-elles dans `std::map` et comment puis-je y remédier ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-26 04:49:15548parcourir

Why Do `char*` Keys Fail in `std::map`, and How Can I Fix It?

La perplexité des clés char* dans std::map

Lorsque vous traitez avec des conteneurs basés sur le hachage comme std::map, compréhension de la clé types est crucial. Un problème particulier survient lors de l'utilisation de char* comme clé de carte, comme illustré dans le code suivant :

std::map<char*, int> g_PlayerNames;

Ce code tente de stocker les noms de joueurs (char*) comme clés et les entiers correspondants comme valeurs. Cependant, lors de la recherche d'une entrée à l'aide d'un nom connu, la comparaison échoue, conduisant à des résultats inattendus.

La cause profonde réside dans la nature particulière de char en tant que clé. std::map compare les clés par défaut en utilisant l'opérateur inférieur à (<). Cependant, pour les pointeurs char, cette comparaison vérifie les adresses des pointeurs plutôt que les chaînes vers lesquelles ils pointent.

Pour résoudre ce problème, nous devons fournir une fonction de comparaison personnalisée qui opère sur les chaînes réelles, et non les pointeurs. L'introduction d'une structure comme celle-ci nous permet de faire cela :

struct cmp_str
{
    bool operator()(char const *a, char const *b) const
    {
        return std::strcmp(a, b) < 0;
    }
};

En fournissant cette fonction de comparaison personnalisée, nous demandons à std::map de comparer les clés char* en fonction des chaînes auxquelles elles font référence, en garantissant la clé correcte correspondance lors des recherches et des insertions.

Ainsi, au lieu d'utiliser la définition de carte originale, nous la modifions pour inclure la comparaison function :

map g_PlayerNames;

Avec cette modification, la logique de recherche et de mise à jour du nom du joueur fonctionne comme prévu, en utilisant la fonction de comparaison pour faire correspondre les clés char* en fonction de leur contenu de chaîne.

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