Ich habe gerade einige Empfehlungen zur Verwendung gelesen
std::string s = get_string();
std::string t = another_string();
if( !s.compare(t) )
{
anstatt
if( s == t )
{
Ich benutze fast immer den letzten, weil ich daran gewöhnt bin und er sich natürlich und lesbarer anfühlt. Ich wusste nicht einmal, dass es eine separate Vergleichsfunktion gibt. Genauer gesagt dachte ich, == würde compare () aufrufen.
Was sind die Unterschiede? In welchen Kontexten sollte ein Weg dem anderen vorgezogen werden?
Ich betrachte nur die Fälle, in denen ich wissen muss, ob eine Zeichenfolge den gleichen Wert wie eine andere Zeichenfolge hat.
if(x.compare(y) == 0)
<- Gleichheitszeichen, es ist gleich. Die Verwendung von IMO!
dient nur dazu, Code unlesbar zu machen.compare
return-1
ifs
ist niedriger alst
und+1
ifs
ist größer alst
while==
returntrue/false
. Ganzzahlen ungleich Null sindtrue
und0
sindfalse
.Antworten:
Darüber sagt der Standard
operator==
Es scheint, als gäbe es keinen großen Unterschied!
quelle
!s.compare(t)
unds == t
gibt den gleichen Wert zurück, aber die Vergleichsfunktion liefert mehr Informationen alss == t
unds == t
ist besser lesbar, wenn Sie sich nicht darum kümmern, wie sich die Zeichenfolgen unterscheiden, sondern nur, wenn sie sich unterscheiden.std :: string :: compare () gibt Folgendes zurück
int
:s
undt
gleich sind,s
kleiner als istt
,s
größer als istt
.Wenn Sie möchten, dass Ihr erstes Code-Snippet dem zweiten entspricht, sollte es tatsächlich lauten:
Der Gleichheitsoperator prüft nur auf Gleichheit (daher sein Name) und gibt a zurück
bool
.Eine Erläuterung der Anwendungsfälle
compare()
kann hilfreich sein, wenn Sie daran interessiert sind, wie sich die beiden Zeichenfolgen zueinander verhalten (kleiner oder größer), wenn sie sich zufällig unterscheiden. PlasmaHH erwähnt zu Recht Bäume, und es könnte sich beispielsweise auch um einen Algorithmus zum Einfügen von Zeichenfolgen handeln, der darauf abzielt, den Container sortiert zu halten, einen dichotomischen Suchalgorithmus für den oben genannten Container usw.BEARBEITEN: Wie Steve Jessop in den Kommentaren hervorhebt,
compare()
ist es am nützlichsten für schnelle Sortier- und binäre Suchalgorithmen. Natürliche Sortierungen und dichotomische Suchen können nur mit std :: less implementiert werden .quelle
std::less
in diesem Fall auch eine Gesamtreihenfolge) anstelle eines Drei-Wege-Komparators zu verwenden .compare()
ist für Operationen, die nachstd::qsort
und modelliert sindstd::bsearch
, im Gegensatz zu Operationen , die nachstd:sort
und modelliert sindstd::lower_bound
.compare
hat Überladungen zum Vergleichen von Teilzeichenfolgen. Wenn Sie ganze Zeichenfolgen vergleichen, sollten Sie nur den==
Operator verwenden (und ob er aufruftcompare
oder nicht, ist ziemlich irrelevant).quelle
Intern
string::operator==()
verwendetstring::compare()
. Bitte beachten Sie: CPlusPlus -string::operator==()
Ich habe eine kleine Anwendung geschrieben, um die Leistung zu vergleichen, und anscheinend ist die Anwendung
string::compare()
etwas schneller als , wenn Sie Ihren Code in einer Debug-Umgebung kompilieren und ausführenstring::operator==()
. Wenn Sie Ihren Code jedoch in der Release-Umgebung kompilieren und ausführen, sind beide ziemlich gleich.Zu Ihrer Information, ich habe 1.000.000 Iterationen ausgeführt, um zu einer solchen Schlussfolgerung zu gelangen.
Um zu beweisen, warum in der Debug-Umgebung der String :: compare schneller ist, bin ich zur Assembly gegangen und hier ist der Code:
DEBUG BUILD
string :: operator == ()
string :: compare ()
Sie können sehen, dass in string :: operator == () zusätzliche Operationen ausgeführt werden müssen (add esp, 8 und movzx edx, al).
FREIGABE BAUEN
string :: operator == ()
string :: compare ()
Beide Assembly-Codes sind sehr ähnlich, da der Compiler die Optimierung durchführt.
Schließlich ist meiner Meinung nach der Leistungsgewinn vernachlässigbar, daher würde ich es wirklich dem Entwickler überlassen, zu entscheiden, welches das bevorzugte ist, da beide das gleiche Ergebnis erzielen (insbesondere wenn es sich um ein Release-Build handelt).
quelle
compare()
entspricht strcmp ().==
ist eine einfache Gleichheitsprüfung.compare()
Daher wird einint
,==
ist ein Boolescher Wert zurückgegeben.quelle
compare()
wird zurückkehrenfalse
( na ja ,0
wenn die Zeichenfolgen gleich sind.Nehmen Sie es also nicht leicht, einen gegen den anderen auszutauschen.
Verwenden Sie, was den Code lesbarer macht.
quelle
Wenn Sie nur die Gleichheit der Zeichenfolgen überprüfen möchten, verwenden Sie den Operator ==. Das Ermitteln, ob zwei Zeichenfolgen gleich sind, ist einfacher als das Finden einer Reihenfolge (was compare () ergibt). In Ihrem Fall ist es daher möglicherweise leistungsmäßig besser, den Gleichheitsoperator zu verwenden.
Längere Antwort: Die API bietet eine Methode zum Überprüfen der Zeichenfolgengleichheit und eine Methode zum Überprüfen der Zeichenfolgenreihenfolge. Wenn Sie eine Zeichenfolgengleichheit wünschen, verwenden Sie den Gleichheitsoperator (damit Ihre Erwartungen und die der Bibliotheksimplementierer übereinstimmen). Wenn die Leistung wichtig ist, möchten Sie möglicherweise beide Methoden testen und die schnellste finden.
quelle
Angenommen, Sie betrachten zwei Zeichenfolgen s und t.
Gib ihnen einige Werte.
Wenn Sie sie mit (s == t) vergleichen , wird ein boolescher Wert zurückgegeben (true oder false, 1 oder 0).
Wenn Sie jedoch mit s.compare (t) vergleichen , gibt der Ausdruck einen Wert
(i) 0 zurück - wenn s und t gleich sind
(ii) <0 - entweder wenn der Wert des ersten nicht übereinstimmenden Zeichens in s kleiner als der von ist t oder die Länge von s ist kleiner als die von t.
(iii) > 0 - entweder wenn der Wert des ersten nicht übereinstimmenden Zeichens in t kleiner als der von s ist oder die Länge von t kleiner als der von s ist.
quelle
Eine Sache, die hier nicht behandelt wird, ist, dass es davon abhängt, ob wir String mit C-String, C-String mit String oder String mit String vergleichen.
Ein Hauptunterschied besteht darin, dass beim Vergleichen von zwei Zeichenfolgen die Größengleichheit vor dem Vergleichen überprüft wird und der Operator == dadurch schneller als ein Vergleich ist.
Hier ist der Vergleich, wie ich ihn auf g ++ Debian 7 sehe
quelle