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
Libérer: 2024-12-26 04:49:15
original
575 Les gens l'ont consulté

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;
Copier après la connexion

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;
    }
};
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal