Lecție-punte: șir de caractere vs vector de valori

Mediu~10 min9 pași

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.

Observația-cheie

Î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țieAlegiDe ce
Cuvânt, nume, propozițiestringconținutul e text; ai find, substr, size
Note, vârste, prețurivector<int>faci aritmetică: sume, maxime, sortări numerice
Frecvențe de litereint frecv[26]indexezi cu c - 'a'
Număr foarte mare (sute de cifre)string sau vector<int> cifrenu încape în long long
Citire cu spațiistring + getlinecin >> 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.

Observația-cheie

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.

Greșeli frecvente

Confuzii care strică soluții:

  • Tratezi un string de cifre ca pe un număr. "12" + "3" concatenează („123"), nu adună. Convertește cu s[i] - '0' sau stoi.
  • Compari numere ca text. "100" < "99" e true lexicografic. Pentru ordine numerică, ține valorile într-un vector<int>.
  • Folosești cin >> pentru text cu spații. Pierzi tot ce e după primul spațiu — folosește getline.
  • Alegi string pentru valori mari care încap în long long. Complici degeaba; string e 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 string pentru text și numere uriașe; vector<int> pentru valori pe care le calculezi.
  • Cifrele dintr-un string se convertesc cu c - '0'; șirurile se compară lexicografic, nu numeric.

Întrebarea 1 / 3

Ai de citit o propoziție cu spații și de numărat cuvintele. Ce alegi?