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 |
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)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 lapoz.erase(poz, len)ștergelencaractere de lapoz.
Complexitate
| Operație | Timp |
|---|---|
size(), front(), back(), s[i] | O(1) |
substr(poz, len) | O(len) |
find | O(n · m) în cel mai rău caz (n = lungime șir, m = tipar) |
insert / erase la mijloc | O(n) (mută restul caracterelor) |
Greșeli frecvente de concurs:
findcomparat cu-1: rezultatul e fără semn; testează== string::npos.substrcu poziție prea mare:s.substr(poz)cupoz > size()aruncă excepție (out_of_range). Verificăpozîntâi.s[s.size()] = c: scrie în afara șirului; foloseștepush_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 saustring::npos— niciodată-1.push_back,+=,insert,erasemodifică șirul, darinsert/erasela mijloc costă O(n).