Ho appena letto alcune raccomandazioni sull'uso di
std::string s = get_string();
std::string t = another_string();
if( !s.compare(t) )
{
invece di
if( s == t )
{
Io uso quasi sempre l'ultimo perché ci sono abituato e mi sembra naturale, più leggibile. Non sapevo nemmeno che ci fosse una funzione di confronto separata. Per essere più preciso, pensavo che == chiamasse compare().
**Quali sono le differenze? In quali contesti un modo dovrebbe essere preferito all'altro?
Sto considerando solo i casi in cui ho bisogno di sapere se una stringa ha lo stesso valore di un'altra stringa.
std::string::compare() restituisce un int
:
s
e t
sono uguali,s
è minore di t
,s
è maggiore di t
.Se vuoi che il tuo primo frammento di codice sia equivalente al secondo, dovrebbe effettivamente leggere:
if (!s.compare(t)) {
// 's' and 't' are equal.
}
L'operatore di uguaglianza verifica solo l'uguaglianza (da cui il suo nome) e restituisce un bool
.
Per elaborare i casi d'uso, compare()
può essere utile se si è interessati a come le due stringhe si relazionano l'una con l'altra (minore o maggiore) quando capita che siano diverse. PlasmaHH cita giustamente gli alberi, e potrebbe anche essere, diciamo, un algoritmo di inserimento di stringhe che mira a mantenere il contenitore ordinato, un algoritmo di ricerca dicotomica per il suddetto contenitore, e così via.
EDIT: Come Steve Jessop fa notare nei commenti, compare()
è utile soprattutto per gli algoritmi di ordinamento rapido e di ricerca binaria. Gli ordinamenti naturali e le ricerche dicotomiche possono essere implementati solo con std::less.