Je viens de lire quelques recommandations sur l'utilisation
std::string s = get_string();
std::string t = another_string();
if( !s.compare(t) )
{
au lieu de
if( s == t )
{
J'utilise presque toujours le dernier parce que j'y suis habitué et il semble naturel, plus lisible. Je ne savais même pas qu'il y avait une fonction de comparaison distincte. Pour être plus précis, je pensais que == appellerait compare ().
Quelles sont les différences? Dans quels contextes faut-il privilégier une voie à l'autre?
Je ne considère que les cas où j'ai besoin de savoir si une chaîne a la même valeur qu'une autre chaîne.
if(x.compare(y) == 0)
<- signe égal, c'est égal. L'utilisation de l'OMI!
ne sert qu'à rendre le code illisible.compare
renvoyer-1
sis
est inférieur àt
et+1
sis
est supérieur àt
pendant le==
retourtrue/false
. Les entiers non nuls sonttrue
et0
sontfalse
.Réponses:
Voilà ce que la norme a à dire
operator==
Il semble qu'il n'y ait pas beaucoup de différence!
la source
!s.compare(t)
ets == t
renverra la même valeur, mais la fonction de comparaison fournit plus d'informations ques == t
, ets == t
est plus lisible lorsque vous ne vous souciez pas de la façon dont les chaînes diffèrent, mais uniquement si elles diffèrent.std :: string :: compare () retourne un
int
:s
ett
sont égaux,s
est inférieur àt
,s
est supérieur àt
.Si vous voulez que votre premier extrait de code soit équivalent au second, il devrait en fait se lire:
L'opérateur d'égalité teste uniquement l'égalité (d'où son nom) et renvoie a
bool
.Pour élaborer sur les cas d'utilisation,
compare()
peut être utile si vous êtes intéressé par la façon dont les deux chaînes sont liées l'une à l'autre (moins ou plus) quand elles se trouvent être différentes. PlasmaHH mentionne à juste titre les arbres, et il pourrait également s'agir, par exemple, d'un algorithme d'insertion de chaîne qui vise à conserver le conteneur trié, d'un algorithme de recherche dichotomique pour le conteneur susmentionné, etc.EDIT: Comme le souligne Steve Jessop dans les commentaires,
compare()
est le plus utile pour les algorithmes de tri rapide et de recherche binaire. Les tris naturels et les recherches dichotomiques peuvent être implémentés avec seulement std :: less .la source
std::less
, qui est également un ordre total dans ce cas) plutôt qu'un comparateur à trois voies .compare()
est pour les opérations modélisées surstd::qsort
etstd::bsearch
, contrairement à celles modélisées surstd:sort
etstd::lower_bound
.compare
a des surcharges pour comparer les sous-chaînes. Si vous comparez des chaînes entières, vous devez simplement utiliser l'==
opérateur (et qu'il appellecompare
ou non est à peu près hors de propos).la source
En interne,
string::operator==()
utilisestring::compare()
. Veuillez vous référer à: CPlusPlus -string::operator==()
J'ai écrit une petite application pour comparer les performances, et apparemment, si vous compilez et exécutez votre code sur l'environnement de débogage, il
string::compare()
est légèrement plus rapide questring::operator==()
. Cependant, si vous compilez et exécutez votre code dans l'environnement Release, les deux sont à peu près les mêmes.Pour info, j'ai exécuté 1 000 000 d'itérations afin de parvenir à une telle conclusion.
Afin de prouver pourquoi dans l'environnement de débogage la chaîne :: compare est plus rapide, je suis allé à l'assembly et voici le code:
DEBUG BUILD
string :: operator == ()
string :: compare ()
Vous pouvez voir que dans string :: operator == (), il doit effectuer des opérations supplémentaires (ajouter esp, 8 et movzx edx, al)
RELEASE BUILD
string :: operator == ()
string :: compare ()
Les deux codes d'assemblage sont très similaires car le compilateur effectue l'optimisation.
Enfin, à mon avis, le gain de performances est négligeable, donc je laisse vraiment le soin au développeur de décider lequel est le préféré car les deux atteignent le même résultat (surtout quand il s'agit de la version build).
la source
compare()
est équivalent à strcmp ().==
est une simple vérification d'égalité.compare()
renvoie donc unint
,==
est un booléen.la source
compare()
retournerafalse
(enfin0
) si les chaînes sont égales.Alors ne prenez pas à la légère l'échange l'un pour l'autre.
Utilisez celui qui rend le code plus lisible.
la source
Si vous souhaitez simplement vérifier l'égalité des chaînes, utilisez l'opérateur ==. Déterminer si deux chaînes sont égales est plus simple que de trouver un ordre (ce que donne compare (), donc il pourrait être préférable, dans votre cas, d'utiliser les performances de l'opérateur d'égalité.
Réponse plus longue: l'API fournit une méthode pour vérifier l'égalité des chaînes et une méthode pour vérifier l'ordre des chaînes. Vous voulez l'égalité des chaînes, utilisez donc l'opérateur d'égalité (afin que vos attentes et celles des implémenteurs de bibliothèque s'alignent.) Si les performances sont importantes, vous pouvez tester les deux méthodes et trouver la plus rapide.
la source
Supposons que nous considérons deux chaînes s et t.
Donnez-leur des valeurs.
Lorsque vous les comparez à l'aide de (s == t), il renvoie une valeur booléenne (vrai ou faux, 1 ou 0).
Mais lorsque vous comparez à l'aide de s.compare (t) , l'expression renvoie une valeur
(i) 0 - si s et t sont égaux
(ii) <0 - soit si la valeur du premier caractère sans correspondance dans s est inférieure à celle de t ou la longueur de s est inférieure à celle de t.
(iii) > 0 - soit si la valeur du premier caractère sans correspondance dans t est inférieure à celle de s ou la longueur de t est inférieure à celle de s.
la source
Une chose qui n'est pas couverte ici est que cela dépend si nous comparons chaîne à chaîne c, chaîne c à chaîne ou chaîne à chaîne.
Une différence majeure est que pour comparer deux chaînes, l'égalité de taille est vérifiée avant de faire la comparaison et cela rend l'opérateur == plus rapide qu'une comparaison.
voici la comparaison telle que je la vois sur g ++ Debian 7
la source