7
votes

C TRANCHE CLORGE CLÉ

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;
}


0 commentaires

3 Réponses :


8
votes

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

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 parce que vous n'avez pas besoin char * , vous pouvez Utilisez un std :: chaîne à la place. (Vous pouvez fournir une fonction de comparaison personnalisée - comme indiqué par Simoncon, mais je vous conseillerais contre elle) xxx

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 [] et être initialisé. Le même problème existe avec l'affectation: xxx

La carte pourrait maintenant avoir 1 ou 2 éléments.


0 commentaires

7
votes

Vous pouvez fournir une carte avec un comparateur personnalisé qui compare les chaînes C xxx


3 commentaires

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 == n'est jamais utilisé pour rien sur la carte: il s'agit toujours du comparateur fourni, qui par défaut à std :: moins . La carte a besoin d'un seul et un seul critère pour qu'il fonctionne correctement.



1
votes

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.

Dans la plupart des scénarios réalistes lorsque vous interrogez une carte, vos clés ne seront pas littérales.

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.

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.


0 commentaires