Forskelle mellem C++ string == og compare()?

Jeg har lige læst nogle anbefalinger om at bruge

std::string s = get_string();
std::string t = another_string();

if( !s.compare(t) ) 
{

i stedet for

if( s == t )
{

Jeg bruger næsten altid den sidste, fordi jeg er vant til det, og det føles naturligt og mere læsbart. Jeg vidste ikke engang, at der fandtes en separat sammenligningsfunktion. For at være mere præcis troede jeg, at == ville kalde compare().

Hvad er forskellene? I hvilke sammenhænge bør den ene måde foretrækkes frem for den anden?

Jeg overvejer kun de tilfælde, hvor jeg skal vide, om en streng er den samme værdi som en anden streng.

std::string::compare() returnerer et int:

  • lig nul, hvis s og t er ens,
  • mindre end nul, hvis s er mindre end t,
  • større end nul, hvis s er større end t.

Hvis du ønsker, at dit første kodestykke skal svare til det andet, skal det faktisk læses:

if (!s.compare(t)) {
    // 's' and 't' are equal.
}

Lighedsoperatoren tester kun for lighed (deraf navnet) og returnerer et bool.

For at uddybe anvendelsesmulighederne kan compare() være nyttig, hvis du er interesseret i, hvordan de to strenge forholder sig til hinanden (mindre eller større), når de tilfældigvis er forskellige. PlasmaHH nævner med rette træer, og det kunne også være f.eks. en algoritme til indsættelse af strenge, der har til formål at holde containeren sorteret, en dikotomisk søgealgoritme for den førnævnte container osv.

EDIT: Som Steve Jessop påpeger i kommentarerne, er compare() mest anvendelig til hurtige sorteringsalgoritmer og binære søgealgoritmer. Naturlige sorteringer og dikotomiske søgninger kan kun implementeres med std::less.

Kommentarer (4)

compare har overbelastninger til sammenligning af understrenge. Hvis du sammenligner hele strenge, bør du bare bruge == operatoren (og om den kalder compare eller ej er stort set irrelevant).

Kommentarer (0)

compare() svarer til strcmp(). == er simpel lighedskontrol. compare() returnerer derfor et int, `compare== er et boolean.

Kommentarer (0)