J'ai une question:
Disons qu'il y a deux std::string
Et que je veux les comparer, il y a la possibilité d'utiliser la fonction compare()
de la classe string
mais j'ai aussi remarqué que c'est possible en utilisant de simples opérateurs < > !=
(les deux cas sont possibles même si je n'inclus pas la bibliothèque <string>
). Quelqu'un peut-il expliquer pourquoi la fonction compare()
existe si une comparaison peut être faite à l'aide d'opérateurs simples?
btw J'utilise Code :: Blocks 13.12 voici un exemple de mon code:
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::getline;
int main()
{
string temp1, temp2;
cout << "Enter first Word: ";
getline (cin,temp1);
cout << "Enter second Word: ";
getline (cin,temp2);
cout << "First Word: " << temp1 << endl << "Second Word: " << temp2 << endl;
if (temp1 > temp2)
{
cout << "One" << endl;
}
if (temp1.compare(temp2) < 0)
{
cout << "Two" << endl;
}
return 0;
}
.compare()
renvoie un entier, qui est une mesure de la différence entre les deux chaînes.
0
indique que les deux chaînes se comparent comme égales.operator==
renvoie simplement un booléen, indiquant si les chaînes sont égales ou non.
Si vous n'avez pas besoin des détails supplémentaires, vous pouvez tout aussi bien utiliser ==
.
string cat = "cat";
string human = "human";
cout << cat.compare(human) << endl;
Ce code donnera -1 comme résultat. Cela est dû au fait que le premier caractère non correspondant de la chaîne comparée "h" est inférieur ou apparaît après "c" dans l'ordre alphabétique, même si la chaîne comparée, "humain" est plus longue que "chat".
Je trouve que la valeur de retour décrite dans cplusplus.com est plus précise qui sont-:
0: Ils se comparent égaux
<0: Soit la valeur du premier caractère qui ne correspond pas est inférieure dans la chaîne comparée, soit tous les caractères comparés correspondent mais la chaîne comparée est plus courte.
plus de 0: soit la valeur du premier caractère qui ne correspond pas est supérieure dans la chaîne comparée, soit tous les caractères comparés correspondent mais la chaîne comparée est plus longue.
De plus, la description de IMO cppreference.com est plus simple et correspond le mieux à ma propre expérience.
valeur négative si
*this
apparaît avant la séquence de caractères spécifiée par les arguments, dans l'ordre lexicographiquezéro si les deux séquences de caractères comparent l'équivalent
valeur positive si
*this
apparaît après la séquence de caractères spécifiée par les arguments, dans l'ordre lexicographique
Concernant la question ,
” quelqu'un peut-il expliquer pourquoi la fonction
compare()
existe si une comparaison peut être faite en utilisant des opérandes simples?
Relatif à <
et ==
, la fonction compare
est conceptuellement plus simple et en pratique elle peut être plus efficace car elle évite deux comparaisons par article pour les commandes ordinaires d'articles.
Comme exemple de simplicité, pour les petites valeurs entières, vous pouvez écrire une fonction de comparaison comme ceci:
auto compare( int a, int b ) -> int { return a - b; }
ce qui est très efficace.
Maintenant pour une structure
struct Foo
{
int a;
int b;
int c;
};
auto compare( Foo const& x, Foo const& y )
-> int
{
if( int const r = compare( x.a, y.a ) ) { return r; }
if( int const r = compare( x.b, y.b ) ) { return r; }
return compare( x.c, y.c );
}
Essayer d'exprimer cette comparaison lexicographique directement en termes de <
vous vous retrouvez avec une horrible complexité et inefficacité, relativement parlant.
Avec C++ 11, pour la simplicité seule, la comparaison lexicographique basée sur la comparaison ordinaire peut être mise en œuvre très simplement en termes de comparaison de tuple.