De ce contează?
Tipul char reține o singură literă, dar un cuvânt are multe litere. Ai putea ține
fiecare literă într-o variabilă separată — coșmar. string este cutia care le ține
pe toate la un loc, în ordine, și își ajustează singură mărimea când adaugi sau scoți
caractere.
Ce este un string?
Un string este o secvență de caractere păstrate în ordine, indexate de la 0.
Spre deosebire de tablourile clasice, nu trebuie să-i fixezi dimensiunea: crește și
scade automat. Pentru a-l folosi, incluzi antetul <string>.
Poziția fiecărui caracter contează. s[0] este primul caracter, s[1] al doilea,
iar ultimul caracter este s[s.size() - 1]. Toată lucrul cu șiruri se bazează pe
această indexare.
Pentru string s = "ALGORITM"; celulele arată așa:
| s | A | L | G | O | R | I | T | M |
| index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Operații de bază
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "ALGORITM";
cout << s.size() << endl; // 8 caractere
cout << s[0] << " " << s[7] << endl; // A M
s[0] = 'a'; // modifici un caracter pe loc
cout << s << endl; // aLGORITM
s += "!"; // concatenare
cout << s << endl; // aLGORITM!
return 0;
}Citirea unui string
Aici se nasc cele mai multe bug-uri, deci fii atent la diferență:
#include <iostream>
#include <string>
using namespace std;
int main() {
string cuvant, linie;
cin >> cuvant; // citeste un singur cuvant (se opreste la spatiu)
getline(cin, linie); // citeste restul liniei
cout << cuvant << endl;
cout << linie << endl;
return 0;
}cin >> scitește un cuvânt — se oprește la primul spațiu sau enter.getline(cin, s)citește toată linia, inclusiv spațiile.
Complexitate
| Operație | Timp | Spațiu |
|---|---|---|
s[i] (acces caracter) | O(1) | O(1) |
s.size() | O(1) | O(1) |
| Citire / parcurgere | O(n) | O(n) |
s += t (concatenare) | O(lungime adăugată) | — |
Vizualizare
Un string este, vizual, un vector de caractere indexat de la 0:
| s | c | o | n | c | u | r | s |
| index | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
primul | ultimul |
Capcane clasice cu string:
- Amesteci
cin >>șigetline. Dupăcin >> n, în buffer rămâne un\n; primulgetlineîl prinde și pare gol. Curăță cucin.ignore()înainte degetline. - Indexare de la 1.
s[s.size()]este în afara șirului (caracterul valid es[size()-1]). - Compari cu
==greșit gândit. Lastring,s == tcompară conținutul corect, dar NU confunda cu compararea de pointeri din C (char*). size()întoarceunsigned.s.size() - 1pe un string gol devine un număr uriaș, nu -1. Verifică întâi că șirul nu e gol.
Recapitulare
stringține o secvență de caractere indexată de la 0, cu dimensiune automată.cin >>citește un cuvânt;getlinecitește toată linia (inclusiv spațiile).- Ultimul caracter este
s[s.size() - 1]— atenție căsize()eunsigned.