Ich habe gerade einige Empfehlungen zur Verwendung von
std::string s = get_string();
std::string t = another_string();
if( !s.compare(t) )
{
anstelle von
if( s == t )
{
Ich verwende fast immer die letzte, weil ich daran gewöhnt bin und es sich natürlicher und besser lesbar anfühlt. Ich wusste nicht einmal, dass es eine separate Vergleichsfunktion gibt. Um genauer zu sein, dachte ich, == würde compare() aufrufen.
Was sind die Unterschiede? In welchen Kontexten sollte die eine Methode der anderen vorgezogen werden?
Ich betrachte nur die Fälle, in denen ich wissen muss, ob eine Zeichenkette den gleichen Wert wie eine andere Zeichenkette hat.
std::string::compare() gibt einen int
zurück:
s
und t
gleich sind,s
kleiner ist als t
,s
größer als t
ist.Wenn Sie möchten, dass Ihr erster Codeschnipsel dem zweiten entspricht, sollte er eigentlich lauten:
if (!s.compare(t)) {
// 's' and 't' are equal.
}
Der Gleichheitsoperator testet nur auf Gleichheit (daher sein Name) und gibt ein "bool" zurück.
Um auf die Anwendungsfälle einzugehen: compare()
kann nützlich sein, wenn man sich dafür interessiert, wie sich die beiden Zeichenketten zueinander verhalten (kleiner oder größer), wenn sie unterschiedlich sind. PlasmaHH erwähnt zu Recht Bäume, und es könnte sich auch um einen Algorithmus zum Einfügen von Strings handeln, der darauf abzielt, den Container sortiert zu halten, einen dichotomen Suchalgorithmus für den oben erwähnten Container und so weiter.
EDIT: Wie Steve Jessop in den Kommentaren anmerkt, ist compare()
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.
compare
hat Überladungen für den Vergleich von Teilstrings. Wenn Sie ganze Zeichenketten vergleichen, sollten Sie nur den Operator ==
verwenden (und ob er compare
aufruft oder nicht, ist so gut wie irrelevant).