Descriere Generala
Clasa String
specific C++
este un container pentru șirurile de caractere alocat dinamic. Deși se boicotează folosirea claselor, există multe avantaje în utilizarea lor, altfel ar fi programare în C
nu C++
. Caracteristicile unui programator bun sunt creerea unui algoritm corect, eficient și concis. STL fiind una dintre cele mai folosite biblioteci alături de biblioteca adiționala Boost
.
Concepte Generale
În general containărele au membrii comuni ca și nume, de exemplu .size()
are aceeași denumire ca la vector
și se mai regăsesc și la alte containăre de specialitate. Vezi Vector.
Declarare și constructor
In momentul declarari șirul este initial vid.
string s;
El se poate construii static initial.
string s(5,'a') // lungime 5, poziții 0-4 umplute cu 'a'.
Parcurgere și Atribuire și Concatenare și Comparare
Se realizează cu ajutorul operatorilor +,=,==,!=,>,<,>=,<=
.
Citire și parcurgere și cautare
string s,voc="aeiou"; int ap=0; cin>>s // citirea pana la spatiu | getline(cin,s); // citirea unei linii; for(int i=0;i<s.size();i++) if(voc.find(s[i])!=-1) // căutăm în voc caracterul s[i], dacă el se gasește returnează poziția altfel returnează @-1@. ap++; // numărăm numărul de vocale din șir. cout<<ap;
ATENTIE. În cazul citirii normale a unui șir sau număr trebuie avansat pe următoarea linie inaintea citirii cu getline
se extrage caracterul '\n'
cu cin.get()
.
Atribuire
string s; s="aeiou";
Concatenare
string s,ss; s+="ae" // s="ae"; if(s=="ae") // se verifică dacă s="ae" ss=s; // copiere in ss a lui s for(int i=0;i<s.size();i++) s+=to_string(i); // se transforma din int in sir de caractere si se adauga la final. deci sirul devine s="ae01"; s+=ss; // s="ae01ae"; s=""; // s devine gol
Comparare Lexicografică
Afisăm lexicografic 2
șiruri.
string s="ar",ss="ae"; if(s<ss) swap(s,ss); // interschibăm cout<<s<<" "<<ss;
Prelucrarea șirurilor de caractere
- Funcția pop_back() – există și aici șterge ultimul caracter.
string s="aeiou"; s.pop_back() // s="aeio"
Inserare
for(int i=0;i<s.size();i++) s.insert(s.begin()+i+1,s[i]+1),i++; // Inserarea dupa fiecare caracter, caracterul imediat urmator lexicografic.
Stergerea
voc="aeiou"; for(int i=0;i<s.size();i++) if(voc.find(s[i])!=-1) s.erase(s.begin()+i),i--; // Stergerea vocalelor.
- MAI MULT – Lucrarea cu Functii
Trimiterea ca parametrii la functii a containerlor stl, se face ca la variabile obisnuite, trimis obisnuit se face o copie altfel cu adresă &
modifică direct.
Fara Adresă
void stergere(string s) { s=""; } int main() { string s="aeiou"; stergere(s); // s="aeiou" }
Cu Adresă
void stergere(string &s) { s=""; } int main() { string s="aeiou"; stergere(s); // s="" }
Returnarea Unui Șir De Caractere
string stergere(string s) { s=""; return s; } int main() { string s="aeiou"; s=stergere(s); // s="" }
Inlocuieste
Este o noțiune nouă, înlocuiște de la poziția i
, n
caractere cu șirul ss
.
string s="aeiou",ss="UNU"; s.replace(2,3,ss); //s=aeUNU
Funcții Adiționale
- Convertirea unui string în cstring.
char s[500]; string str="aeiou"; strcpy(s,str.c_str());
- Spargerea în cuvinte pe spații, punerea în vector de cuvinte și sortarea lexicografică și invers lexicografică.
string s; vector<string> v; // vector de stringuri; getline(cin,s); istringstream b(s); // buffer de stringuri inclus in I/O <sstream> sparge implicit pe spații for(string w;b>>w;) // cat timp exista cuvinte in buffer citim in w v.push_back(w); // punem in vector sort(v.begin(),v.end()) // lexicografic || sort(v.begin(),v.end(),greater<string>()); // sortul din algorithm
- Gasirea unui caracter de la sfârșit spre început.
string s="aea"; //s.find('a')=0 //s.rfind('a')=2
- Crearea unui subsir.
string s="aeiou",ss; ss=s.substr(2,3); // de la poziția 2, 3 caractere. //ss="iou"
- Acesarea rapidă a primului și ultimului caracter.
string s="aeiou"; //s.front()='a' , s.back()='u'
DE ASEMENEA .back()
există și pentru vector
.
vector<int> v={5,6,10}; //v.back()=10
- Convertirea unui numar in string
Un număr x
se convertește în șir de caractere cu funcția to_string()
introdusă în C++17
, se poate să nu o compileze un standard mai vechi.
int x=10; string s; s=to_string(x),s+=to_string(x); // s="1010";
- Inversarea unui string
Se foloseste reverse
din <algorithm>
.
string s="aeiou"; reverse(s.begin(),s.end()); //s="uoiea"
- Convertirea unui string intr-un numar intreg sau real
Se folosesc urmatoarele functii:
string s="105"; int x; double y; long long z; unsigned long long w; x=stoi(s); //x=105; y=stod(s); //y=105; z=stoll(s); //z=105; w=stoull(s); //w=105;
- Functii din
<cctype>
de schimbare sau verificare a caracterelor individuale
- Pentru modificare a unor caractere din litere mici in litere mari si vice versa:
string s="AeUr"; for(int i=0;i<s.size();i++) s[i]=tolower(s[i]); //s="aeur" for(int i=0;i<s.size();i++) s[i]=toupper(s[i]); //s="AEUR"
- Pentru verificarea unor proprietati ale caracterelor Se returneaza 1 sau 0 in functie de conditie:
isalnum(char) // daca este litera sau cifre isalpha(char) // daca este litera isspace(char) // daca este spatiu sau caracter separator cum ar fi '\n' iscntrl(char) // daca caracterul este caracter de control cum ar fi '\n' isdigit(char) // daca este cifre isgraph(char) // daca caracterul se poate printa islower(char) // daca este litera mica isupper(char) // daca este litera mare isxdigit(char) // daca este cifra din reprezentarea unui numar in baza 16 ispunct(char) // daca este semn de punctuatie
Si mai multe functii de cautare in siruri de caractere
De asemenea se pot cauta in sir de la inceput spre sfarsit sau invers, primul caracter din sirul de caractere specificat ca argument sau absenta lui.
string s="aebiouq",ss="ierot"; // s.find_first_of(ss)=1 (e) // s_find_last_of(ss)=4 (o) // s.find_first_not_of(ss)=2 (b) // s.find_last_not_of(ss)=6 (q)
Probleme ataşate
Nr. | Problema | Clasa | Dificultate | Operații I/O |
---|---|---|---|---|
1 | #2582 - SecvElim | 10 | ușoară | consola |
2 | #2584 - InsertInvers | 10 | ușoară | consola |
3 | #2592 - AfisSimetric | 10 | medie | consola |
4 | #2673 - SwapCuv | 10 | medie | consola |
5 | #2678 - FormNr | 10 | medie | consola |
6 | #2681 - InversMax | 10 | dificilă | consola |
7 | #2680 - Poezie | 10 | medie | consola |
8 | #2682 - LungimeRandMax | 10 | concurs | fișiere |
9 | #2686 - ASCIIComp | 10 | medie | consola |
10 | #2692 - LungSortDesc | 10 | ușoară | consola |
11 | #2693 - VocSortDesc | 10 | ușoară | consola |
12 | #2738 - DistLungMax | 10 | ușoară | consola |
13 | #2739 - SirPlatou | 10 | dificilă | consola |
14 | #2803 - ElimP | 10 | medie | consola |
15 | #2804 - strncat | 10 | medie | consola |