Y a-t-il un problème avec l'utilisation d'une chaîne C en tant que clé de carte?
bool operator==(const char* a, const char* b) { return strcmp(a, b) == 0 ? true : false; }
3 Réponses :
est-il possible de surcharger l'opérateur == pour Const Char * de sorte que la chaîne C réelle C et non les valeurs du pointeur seraient utilisées pour déterminer si les éléments de carte sont égaux p>
Non Ce n'est pas, et oui, ce n'est pas une bonne idée pour exactement la raison indiquée dans la question
et strong> parce que vous n'avez pas besoin char * code>, vous pouvez Utilisez un
std :: chaîne code> à la place. (Vous pouvez fournir une fonction de comparaison personnalisée - comme indiqué par Simoncon, mais je vous conseillerais contre elle) p>
xxx pré> oui, et ils peuvent même se référer à des éléments qui ne font pas " Il existe encore, mais ils seront créés par
opérateur [] code> et être initialisé. Le même problème existe avec l'affectation: p>
xxx pré> La carte pourrait maintenant avoir 1 ou 2 éléments. P> blockQquote>
Vous pouvez fournir une carte avec un comparateur personnalisé qui compare les chaînes C
Je sais que le comparateur est utilisé pour déterminer la position des éléments sur la carte, mais il est également utilisé pour déterminer si deux éléments de carte sont égaux? En d'autres termes, si vous fournissez un comparateur, il sera utilisé sur l'opérateur == pour déterminer si deux éléments de carte sont égaux?
Une carte indique que deux éléments sont "équivalents" si ni non plus que l'autre. Donc, par exemple, si votre comparaison de chaîne est insensible à la casse, la carte peut contenir "ABC" ou "ABC" mais pas les deux.
@ user974967 opérateur == code> n'est jamais utilisé pour rien sur la carte: il s'agit toujours du comparateur fourni, qui par défaut à
std :: moins code>. La carte a besoin d'un seul et un seul critère pour qu'il fonctionne correctement.
Premièrement, afin d'introduire la commande sur les touches de la carte, vous devez définir une comparaison "moins que". Une carte indique que deux éléments sont "équivalents" si ni non plus que l'autre. C'est une mauvaise idée d'utiliser Char * pour les clés de la carte, car vous devrez faire une gestion de la mémoire quelque part en dehors de la carte. P>
Dans la plupart des scénarios réalistes lorsque vous interrogez une carte, vos clés ne seront pas littérales. P>
D'autre part, si vous conservez un bassin de littéraux de chaîne vous-même et attribuez un ID à chaque littéral, vous pouvez utiliser ces identifiants pour les clés de la carte. P>
Résumer, je ne voudrais pas compter sur Microsoft disant "dans certains cas, les littéraux peuvent être mis en commun". Si vous remplissez la carte avec des littéraux et si vous interrogez la carte avec des littéraux comme des touches, vous pouvez aussi bien utiliser Enum pour les clés. P>