web-dev-qa-db-fra.com

Comparaison de chaînes, c ++

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

.compare() renvoie un entier, qui est une mesure de la différence entre les deux chaînes.

  • Une valeur de retour de 0 indique que les deux chaînes se comparent comme égales.
  • Une valeur positive signifie que la chaîne comparée est plus longue ou que le premier caractère non correspondant est plus grand.
  • Une valeur négative signifie que la chaîne comparée est plus courte ou que le premier caractère non correspondant est inférieur.

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 ==.

31
Tom Fenech
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 lexicographique

zé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

4
Idz

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.

2