De ce contează?
Ai în mână două caiete care arată la fel: file numerotate, scris pe rânduri. Unul e un
jurnal (text — litere, spații, semne), celălalt un catalog de note (numere). Aceeași
formă, dar le folosești complet diferit. La fel stau lucrurile cu string și
vector<int>: ambele sunt secvențe indexate de la 0, dar alegi în funcție de ce ții în ele.
Aceeași formă, scop diferit
Atât string, cât și un vector de valori sunt secvențe indexate de la 0, parcurse
cu aceeași buclă for (i = 0; i < n; i++). Diferența nu e în formă, ci în conținut
și în operațiile naturale pe el.
Întrebarea care decide: prelucrez text (litere, cuvinte, semne) sau valori numerice
pe care le compar și le adun? Text → string. Numere → vector<int> / int[].
Tabel de decizie
| Situație | Alegi | De ce |
|---|---|---|
| Cuvânt, nume, propoziție | string | conținutul e text; ai find, substr, size |
| Note, vârste, prețuri | vector<int> | faci aritmetică: sume, maxime, sortări numerice |
| Frecvențe de litere | int frecv[26] | indexezi cu c - 'a' |
| Număr foarte mare (sute de cifre) | string sau vector<int> cifre | nu încape în long long |
| Citire cu spații | string + getline | cin >> taie la primul spațiu |
Două capcane care vin din confuzie
Un număr „mare" citit ca string nu e un întreg — e text. Ca să-i aduni cifrele,
le convertești una câte una:
#include <iostream>
#include <string>
using namespace std;
int main() {
string nr = "12345";
int suma = 0;
for (char c : nr) {
suma += c - '0'; // cifra-caracter -> valoare numerica
}
cout << suma << endl; // 15
return 0;
}Iar invers: dacă valorile sunt numere pe care le compari și le aduni, un string te
încurcă — "10" < "9" e adevărat alfabetic (compari '1' cu '9'), dar fals numeric.
Compararea diferă fundamental: string-urile se compară lexicografic (ca în dicționar),
nu după valoare. „10" vine înaintea lui „9" în ordine de dicționar.
Confuzii care strică soluții:
- Tratezi un
stringde cifre ca pe un număr."12" + "3"concatenează („123"), nu adună. Convertește cus[i] - '0'saustoi. - Compari numere ca text.
"100" < "99"etruelexicografic. Pentru ordine numerică, ține valorile într-unvector<int>. - Folosești
cin >>pentru text cu spații. Pierzi tot ce e după primul spațiu — foloseștegetline. - Alegi
stringpentru valori mari care încap înlong long. Complici degeaba;stringe pentru numere care chiar nu încap (sute de cifre).
Recapitulare
stringși vectorul de valori au aceeași formă (secvență indexată), dar scop diferit.- Alege
stringpentru text și numere uriașe;vector<int>pentru valori pe care le calculezi. - Cifrele dintr-un
stringse convertesc cuc - '0'; șirurile se compară lexicografic, nu numeric.