std::string::compare în C++

Compară două șiruri și returnează un număr negativ, zero sau pozitiv, ca la sortare.

Sintaxă
int compare(const std::string& alt) const;
int compare(std::size_t poz, std::size_t n, const std::string& alt) const;

Ce face std::string::compare

a.compare(b) returnează 0 dacă șirurile sunt identice, un număr negativ dacă a vine înaintea lui b în ordine lexicografică și un număr pozitiv dacă vine după. Contează doar semnul, nu valoarea exactă.

Comparația se face octet cu octet, după codurile caracterelor: majusculele (A=65) vin înaintea minusculelor (a=97), iar literele cu diacritice (coduri peste 127) vin după toate literele fără diacritice. Pentru o simplă verificare de egalitate sau ordine, operatorii ==, <, > sunt mai clari.

Varianta cu poziție compară doar o bucată din șir, fără să creeze un subșir nou.

Parametri

Parametru Descriere
alt Șirul cu care se compară.
poz, n Opțional: se compară doar n caractere de la poz din șirul curent.

Ce returnează

Un int: negativ, 0 sau pozitiv.

Exemple

Exemplul 1: Ordinea a două nume

#include <iostream>
#include <string>

const char* semn(int r) {
    return r < 0 ? "înainte" : (r == 0 ? "egal" : "după");
}

int main() {
    std::string a = "Ana";
    std::cout << "Ana vs Bogdan: " << semn(a.compare("Bogdan")) << '\n';
    std::cout << "Ana vs Ana: " << semn(a.compare("Ana")) << '\n';
    std::cout << "Ana vs ana: " << semn(a.compare("ana")) << '\n';
    std::cout << "Ana vs Andrei: " << semn(a.compare("Andrei")) << '\n';
}

Rezultat

Ana vs Bogdan: înainte
Ana vs Ana: egal
Ana vs ana: înainte
Ana vs Andrei: înainte

Exemplul 2: Compararea unei bucăți

#include <iostream>
#include <string>

int main() {
    std::string numar = "+40740123456";
    if (numar.compare(0, 3, "+40") == 0) {
        std::cout << "Număr din România\n";
    }
}

Rezultat

Număr din România

Greșeli frecvente

  • Verifici if (a.compare(b)) crezând că înseamnă „egale”: este adevărat tocmai când șirurile diferă. Folosește a == b.
  • Sortezi nume românești cu comparația implicită: „Ștefan” ajunge după „Zoe”, pentru că „Ș” are cod mai mare. Ordinea alfabetică corectă cere o comparație cu localizare (std::locale, std::collate).

Comenzi înrudite

  • std::string::starts_with: Verifică dacă șirul începe (starts_with) sau se termină (ends_with) cu un text dat (C++20).
  • std::strcmp: Compară două șiruri C: 0 dacă sunt egale, negativ sau pozitiv după ordinea lor.
  • std::memcmp: Compară n octeți din două zone de memorie: 0 dacă sunt identici.