Μόλις διάβασα κάποιες συστάσεις για τη χρήση
std::string s = get_string();
std::string t = another_string();
if( !s.compare(t) )
{
αντί για
if( s == t )
{
Χρησιμοποιώ σχεδόν πάντα το τελευταίο, επειδή το έχω συνηθίσει και το αισθάνομαι φυσικό, πιο ευανάγνωστο. Δεν ήξερα καν ότι υπήρχε ξεχωριστή λειτουργία σύγκρισης. Για να είμαι πιο ακριβής, νόμιζα ότι το == θα καλούσε την compare().
Ποιες είναι οι διαφορές; Σε ποιες περιπτώσεις θα πρέπει να προτιμάται ο ένας τρόπος έναντι του άλλου;
Σκέφτομαι μόνο τις περιπτώσεις όπου πρέπει να ξέρω αν ένα αλφαριθμητικό έχει την ίδια τιμή με ένα άλλο αλφαριθμητικό.
std::string::compare() επιστρέφει ένα int
:
s
και t
είναι ίσα,s
είναι μικρότερο από το t
,s
είναι μεγαλύτερο από το t
.Αν θέλετε το πρώτο απόσπασμα κώδικα να είναι ισοδύναμο με το δεύτερο, θα πρέπει στην πραγματικότητα να διαβάζεται:
if (!s.compare(t)) {
// 's' and 't' are equal.
}
Ο τελεστής equality ελέγχει μόνο την ισότητα (εξ ου και το όνομά του) και επιστρέφει ένα bool
.
Για να αναλύσουμε τις περιπτώσεις χρήσης, η compare()
μπορεί να είναι χρήσιμη αν σας ενδιαφέρει πώς οι δύο συμβολοσειρές σχετίζονται μεταξύ τους (μικρότερες ή μεγαλύτερες) όταν τυχαίνει να είναι διαφορετικές. Το PlasmaHH δικαίως αναφέρει τα δέντρα, και θα μπορούσε επίσης να είναι, ας πούμε, ένας αλγόριθμος εισαγωγής συμβολοσειρών που στοχεύει να κρατήσει το δοχείο ταξινομημένο, ένας αλγόριθμος διχοτομικής αναζήτησης για το προαναφερθέν δοχείο, και ούτω καθεξής.
EDIT: Όπως επισημαίνει ο Steve Jessop στα σχόλια, η compare()
είναι πιο χρήσιμη για αλγορίθμους γρήγορης ταξινόμησης και δυαδικής αναζήτησης. Οι φυσικές ταξινομήσεις και οι διχοτομικές αναζητήσεις μπορούν να υλοποιηθούν μόνο με std::less.
Η compare
έχει υπερφορτώσεις για τη σύγκριση υποσύνολων. Αν συγκρίνετε ολόκληρες συμβολοσειρές, θα πρέπει να χρησιμοποιήσετε τον τελεστή ==
(και το αν καλεί το compare
ή όχι είναι λίγο πολύ άσχετο).