Funcții specifice — uneltele clasei string

Bază~16 min7 pași

De ce contează?

Un meșter bun nu cioplește totul cu un singur cuțit — are o trusă cu unelte potrivite fiecărei sarcini. La fel, clasa string îți dă o trusă de funcții gata făcute: să cauți, să tai o bucată, să adaugi sau să ștergi caractere.

De ce funcții gata făcute?

Ai putea scrie de mână fiecare operație pe caractere, dar string îți oferă funcții testate și rapide. Le folosești corect dacă înțelegi ce întoarce fiecare și ce indici așteaptă.

Lungime și acces sigur

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "algoritm";
    cout << s.size() << "\n";     // 8
    cout << s.front() << "\n";    // a (primul caracter)
    cout << s.back() << "\n";     // m (ultimul caracter)
    cout << s.empty() << "\n";    // 0 (nu e gol)
    return 0;
}

front() și back() îți dau primul și ultimul caracter fără să calculezi tu indecșii — mai sigur decât s[s.size() - 1].

substr — taie o bucată

s.substr(poz, len) întoarce un nou string: len caractere începând de la indexul poz. Dacă omiți len, ia tot până la final.

s
a
l
g
o
r
i
t
m
index
0
1
2
3
4
5
6
7
s.substr(2, 3) ia 3 caractere de la indexul 2 → „gor”.
string s = "algoritm";
cout << s.substr(2, 3) << "\n";  // gor
cout << s.substr(5) << "\n";     // itm (de la 5 pana la final)

find — caută o poziție

s.find(...) întoarce indexul primei apariții, sau string::npos dacă nu găsește. npos este o valoare uriașă fără semn, NU -1.

string s = "abracadabra";
size_t poz = s.find('c');
if (poz != string::npos)
    cout << "gasit la " << poz << "\n";  // gasit la 4

cout << s.find("dab") << "\n";   // 6 (cauta un subsir intreg)
cout << s.find('a', 1) << "\n";  // 3 (cauta de la indexul 1 incolo)
Observația-cheie

Compari mereu rezultatul lui find cu string::npos, nu cu -1. Pentru că npos e fără semn, if (s.find('x') == -1) dă rezultate imprevizibile.

Modificare: adăugare și ștergere

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "caine";
    s.push_back('!');        // adauga un caracter la final -> "caine!"
    s += " mare";            // concatenare -> "caine! mare"
    s.insert(0, ">> ");      // insereaza la inceput -> ">> caine! mare"
    s.erase(0, 3);           // sterge 3 caractere de la 0 -> "caine! mare"
    cout << s << "\n";
    return 0;
}
  • push_back(c) / += adaugă la final.
  • insert(poz, text) bagă text începând de la poz.
  • erase(poz, len) șterge len caractere de la poz.

Complexitate

OperațieTimp
size(), front(), back(), s[i]O(1)
substr(poz, len)O(len)
findO(n · m) în cel mai rău caz (n = lungime șir, m = tipar)
insert / erase la mijlocO(n) (mută restul caracterelor)
Greșeli frecvente

Greșeli frecvente de concurs:

  • find comparat cu -1: rezultatul e fără semn; testează == string::npos.
  • substr cu poziție prea mare: s.substr(poz) cu poz > size() aruncă excepție (out_of_range). Verifică poz întâi.
  • s[s.size()] = c: scrie în afara șirului; folosește push_back.
  • insert/erase în buclă pe șir mare: fiecare apel e O(n), deci O(n²) total — poate depăși limita de timp. Construiește rezultatul într-un string nou.

Recapitulare

  • size, front, back, substr îți dau acces sigur la părți din șir.
  • find întoarce indexul sau string::npos — niciodată -1.
  • push_back, +=, insert, erase modifică șirul, dar insert/erase la mijloc costă O(n).

Întrebarea 1 / 3

Ce returnează `s.find('x')` dacă litera `x` nu apare în `s`?