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;
}
.compare()
gibt eine Ganzzahl zurück, die ein Maß für den Unterschied zwischen den beiden Zeichenfolgen ist.
0
gibt an, dass die beiden Zeichenfolgen als gleich verglichen werden.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 ==
.
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 Zeichenfolgenull, wenn beide Zeichenfolgen gleichwertig sind
positiver Wert, wenn
*this
erscheint nach der durch die Argumente angegebenen Zeichenfolge in lexikografischer Reihenfolge
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.