32711 afișări Andrei Visalon (Prekzursil) 14.08.2023 www.pbinfo.ro
Etichete: STL

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
32711 afișări Andrei Visalon (Prekzursil) 14.08.2023 www.pbinfo.ro