wake-up-neo.com

Strings vergleichen, c ++

Ich habe eine Frage:

Nehmen wir an, es gibt zwei std::string Und ich möchte sie vergleichen. Es gibt die Möglichkeit, die Funktion compare() der Klasse string zu verwenden, aber ich habe auch bemerkt, dass dies der Fall ist möglich mit einfachen < > != - Operatoren (beide Fälle sind möglich, auch wenn ich die <string> - Bibliothek nicht einbinde). Kann jemand erklären, warum die Funktion compare() existiert, wenn ein Vergleich mit einfachen Operatoren durchgeführt werden kann?

übrigens verwende ich Code :: Blocks 13.12. Hier ist ein Beispiel für meinen 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() gibt eine Ganzzahl zurück, die ein Maß für den Unterschied zwischen den beiden Zeichenfolgen ist.

  • Ein Rückgabewert von 0 gibt an, dass die beiden Zeichenfolgen als gleich verglichen werden.
  • Ein positiver Wert bedeutet, dass die verglichene Zeichenfolge länger ist oder das erste nicht übereinstimmende Zeichen größer ist.
  • Ein negativer Wert bedeutet, dass die verglichene Zeichenfolge kürzer oder das erste nicht übereinstimmende Zeichen niedriger ist.

operator== gibt einfach einen Booleschen Wert zurück, der angibt, ob die Zeichenfolgen gleich sind oder nicht.

Wenn Sie keine zusätzlichen Details benötigen, können Sie auch einfach ==.

31
Tom Fenech
string cat = "cat";
string human = "human";

cout << cat.compare(human) << endl; 

Dieser Code ergibt -1. Dies liegt daran, dass das erste nicht übereinstimmende Zeichen der verglichenen Zeichenfolge 'h' niedriger ist oder nach 'c' in alphabetischer Reihenfolge angezeigt wird, obwohl die verglichene Zeichenfolge 'human' länger als 'cat' ist.

Ich finde den in cplusplus.com beschriebenen Rückgabewert genauer welche sind-:

0: Sie vergleichen gleich

<0: Entweder ist der Wert des ersten nicht übereinstimmenden Zeichens in der verglichenen Zeichenfolge niedriger, oder alle verglichenen Zeichen stimmen überein, aber die verglichene Zeichenfolge ist kürzer.

mehr als 0: Entweder ist der Wert des ersten nicht übereinstimmenden Zeichens in der verglichenen Zeichenfolge größer, oder alle verglichenen Zeichen stimmen überein, aber die verglichene Zeichenfolge ist länger.

Darüber hinaus ist die Beschreibung von IMO cppreference.com einfacher und meiner Erfahrung nach soweit am besten zu beschreiben.

negativer Wert, wenn *this erscheint in lexikografischer Reihenfolge vor der durch die Argumente angegebenen Zeichenfolge

null, wenn beide Zeichenfolgen gleichwertig sind

positiver Wert, wenn *this erscheint nach der durch die Argumente angegebenen Zeichenfolge in lexikografischer Reihenfolge

4
Idz

In Bezug auf die Frage ,

Kann jemand erklären, warum die Funktion compare() existiert, wenn ein Vergleich mit einfachen Operanden möglich ist?

Gegenüber < Und == Ist die Funktion compare konzeptionell einfacher und kann in der Praxis effizienter sein, da bei der normalen Bestellung von Artikeln zwei Vergleiche pro Artikel vermieden werden.


Zur Vereinfachung können Sie für kleine Ganzzahlen eine Vergleichsfunktion wie die folgende schreiben:

auto compare( int a, int b ) -> int { return a - b; }

das ist sehr effizient.

Nun zu einer Struktur

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

Wenn Sie versuchen, diesen lexikografischen Vergleich direkt in < Auszudrücken, werden Sie relativ gesehen mit entsetzlicher Komplexität und Ineffizienz konfrontiert.


Mit C++ 11 kann allein der Einfachheit halber ein gewöhnlicher lexikografischer Vergleich, der auf weniger als einem Vergleich basiert, in Bezug auf den Tupel-Vergleich sehr einfach implementiert werden.