Documente Academic
Documente Profesional
Documente Cultură
• Conținutul STL
• Containere – clasificare
• Iteratori – clasificare
• Operații de bază
• vector: declarare, acces, iteratori, inserări,
ștergeri, comparări
• deque
• list
• map, multimap
• set, multiset
• bitset
Conținutul STL
• Containere: obiecte ce conțin alte obiecte
• Iteratori: “pointeri” pentru parcurgerea
containerelor
• Algoritmi generici: funcții ce se aplică
diverselor tipuri de containere
• Clase adaptor: clase ce adaptează alte clase
(variații ale altor containere)
• Alocatori: obiecte responsabile cu alocarea
spațiului
• Toate componentele stl sunt template-uri
Containere secvențe
• clase template ce implementează structuri de
date în care memoria este organizată secvențial
– suportă accesul secvențial la componente
– în unele cazuri acces aleator
• vector<T> : fișierul header <vector>
• suportă acces aleator la elemente
• timp constant pentru inserție și eliminarea
componentelor de la sfârșit
• timp liniar pentru inserarea și eliminarea
elementelor de la început și interior
• lungime variabilă
Containere secvențe
• deque<T>: fișierul header <deque>
– suportă acces (inserare și eliminare) la ambele
capete
– lungime variabilă
c.push_back(x)
inserează x la sfârșit
c.pop_back()
elimină de la sfârșit
c.push_front(x)
inserează x la început
c.pop_front()
elimină de la început
Funcții utile
c.size() // numărul de elemente
c.empty() // este c vid?
c.capacity() // (numai pentru vector) spațiul alocat
c.reserve(n) // (numai pentru vector) alocă spațiu
c.resize() // (numai pentru vector) adaugă elemente la
// sfârșit
max_size() // (numai pentru vector) dim celui mai mare
// vector posibil
swap(c1, c2) // intershimbă conținuturile a 2 containere
== // testul de egalitate
!= // testul diferit
< // relația de ordine lexicografică
Iteratori
• Iterator: abstracție a noțiunii de pointer la un element din
secvență
• obiect ce poate naviga printr-un container
– operatorii de dereferențiere * și -> permit accesul la obiectul
curent
– operatorul ++ (--) permite accesul la obiectul următor
(precedent)
– operatorul ==
• Un iterator se declară în asociație cu un tip anume de
container, este implementat relativ la acel tip dar acest
lucru nu este relevant pentru utilizator
• Fiecare container include funcțiile membru begin(),
end() pentru specificarea valorilor iterator
corespunzătoare primului, respectiv primului după ultimul
obiect din container
• În mod analog pentru explorare reverse: rbegin(),
rend()
Clasificarea iteratorilor
Există 5 categorii de iteratori iar pentru fiecare
categorie sunt definiți operatori specifici pentru citire
(atribuirea obiect = *iterator), scriere(atribuirea
*iterator= obiect), acces, iterație, comparare.
vector<int> Copy;
vector<int>::iterator It = BigInt.begin();
while ( It != BigInt.end() ) {
Copy.push_back(*It);
It++;
}
Utilizare iteratori
vector<int>::iterator It;
It = BigInt.begin(); // primul element
int FirstElement = *It; // copiere primul element
It++; // al doilea element
It = BigInt.end();
// It pointează în afara vectorului
// dereferențierea !!
It--; // inapoi, la ultimul element
int LastElement = *It; // ok
Utilizare iteratori
// vector::rbegin/rend
#include <iostream>
#include <vector>
using namespace std;
int main ()
{
vector<int> myvector;
for (int i=1; i<=5; i++) myvector.push_back(i);
cout << "myvector:";
vector<int>::reverse_iterator rit;
for ( rit=myvector.rbegin() ; rit < myvector.rend(); ++rit )
cout << " " << *rit;
cout << endl;
return 0;
}
//myvector: 5 4 3 2 1
Inserare în vector
• Se poate seta dimensiunea minimă n a
vectorului v prin v.reserve(n)
• Inserarea la sfârșit folosind push_back()
este eficientă
– dacă inserția se face când vectorul este plin, se
realocă spațiu
• pop_back() – elimină ultimul element
• Inserarea într-o poziție intermediară necesită
șiftarea elementelor următoare
Inserare la o anume poziție
0 1 0 19
•Se utilizează un iterator și funcția 1 2 1 18
2 3 2 17
insert() 3 4 3 16
4 6 4 40
5 6 5 15
vector<int> Y; 6 9 6 14
for (int m = 0; m < 20; m++) { 7 9 7 13
Y.insert(Y.begin(), m); 8 9 8 12
cout << setw(3) << m 9 13 9 11
10 13 10 10
<< setw(5) << Y.capacity() 11 13 11 9
<< endl; 12 13 12 8
} 13 19 13 7
14 19 14 6
15 19 15 5
Y.insert(Y.begin()+4, 40);
16 19 16 4
Y.insert(Y.end()-3, 30); 17 19 17 3
for (int m = 0; m < 20; m++) { 18 19 18 30
cout << setw(3) << m 19 28 19 2
<< setw(5) << Y.at(m) 20 1
21 2
<< endl;
}
Eliminarea elementelor
• de la sfârșit: V.pop_back()
• de la o poziție It (cu șiftare): V.erase(It)
• Iteratorii care referă elemente ce urmează punctului în
care s-a eliminat sunt invalidați:
vector<int> V=Y;
vector<int>::iterator j;
j = V.begin();
while (j != V.end())
V.erase(j++);
• Expression: vector iterator incompatible
vector<int>::iterator j=V.begin();
V.erase(j+10);
V.erase(j+2,j+5);
Alte funcții
• ==
– doi vectori v1 și v2 sunt egali dacă v1.size() =
v2.size() și v1[k] = v2[k] pentru orice index valid k.
• <
– v1<v2 dacă
• primul element v1[i] care nu este egal cu v2[i] este mai
mic decât v2[i], sau
• v1[size] < v2[size] și fiecare v1[i] este egal cu v2[i]
• analog sunt definiți operatorii !=, <=, >, >=
• v1.swap(v2)
Containerul Deque
• coadă cu două capete
• suportă inserare/ștergere eficientă la ambele
capete
• permite inserare/ștergere la orice poziție via
iterator
• Sunt implementate metodele push_front()
și pop_front() împreună cu cele de la vector
(push_back(), pop_back())
• Majoritatea metodelor de la vectori sunt valide și
aici.
• Constructori asemănători cu cei de la vector
Exemplu
int main ()
{
deque<int> first;
deque<int> second;
deque<int> third;
deque<int>::iterator it;
it=first.begin()+1;
Vasile Manea
<multimap>
• container asociativ (ca și map) în care pot
există obiecte cu aceeași cheie
– nu suportă operatorul * +
– argumentul funcției insert() este inserat
întotdeauna
• pentru map m.insert(val) returnează o valoare
pair<iterator, bool>
• pentru multimap mm.insert(val) întoarce doar
un iterator
Operații specializate
iterator find(const key_type& k);
– caută elementul cu cheia k
size_type count(const key_type& k) const;
– numărul elementelor cu cheia k
iterator lower_bound(const key_type& k);
– primul element cu cheia k
iterator upper_bound(const key_type& k);
– primul element cu cheia mai mare decât k
pair<iterator,iterator> equal_range(const
key_type& k);
– începutul și sfârșitul secvenței cu cheia k
Exemplu
int main (){
multimap<char,int> mymm;
multimap<char,int>::iterator it;
pair<multimap<char,int>::iterator,multimap<char
,int>::iterator> ret;
mymm.insert(pair<char,int>('a',10));
mymm.insert(pair<char,int>('b',20));
mymm.insert(pair<char,int>('b',30));
mymm.insert(pair<char,int>('b',40));
mymm.insert(pair<char,int>('c',50));
mymm.insert(pair<char,int>('c',60)); mymm contains:
mymm.insert(pair<char,int>('d',60)); a => 10
cout << "mymm contains:\n"; b => 20 30 40
for (char ch='a'; ch<='d'; ch++) c => 50 60
{ d => 60
cout << ch << " =>";
ret = mymm.equal_range(ch);
for (it=ret.first; it!=ret.second; ++it)
cout << " " << (*it).second;
cout << endl;
}
return 0;
}
set, multiset
• set: un container map în care valorile nu sunt
relevante, se păstrează doar cheile
– elementele în set se păstrează ordonate
– sunt definiți operatorii ==, !=, <, >, <=, >=, swap()
• multiset: un container multimap în care
valorile nu sunt relevante, se păstrează doar
cheile
– accesarea cheilor se face cu equal_range(),
lower_bound(), upper_bound()
Operații
• insert , erase
– prin valoare:
• S.insert(k), S.erase(k);
• M. insert(k), M.erase(k); (șterge toate intrările k)
– prin iteratori:
• S.insert(i), S.erase(i);
• M.insert(i), M.erase(i); (se șterge doar *i)
• find
– S.find(k), M.find(k) ( returnează end() dacă nu-i
găsit)
Exemplu
multiset<int> mymultiset;
multiset<int>::iterator it;
it=mymultiset.begin();
it++;
mymultiset.erase (it); // 10 30 40 40 50 60
mymultiset.erase (40); // 10 30 50 60
it=mymultiset.find (50);
mymultiset.erase ( it, mymultiset.end() ); // 10 30
bitset
• <bitset> definit în std
• un obiect de tipul bitset<n> este un tablou de
n biți
• diferă de:
– un vector<bool> prin faptul că are dimensiune fixă
– un set prin faptul că biții sunt indexați de un întreg
și nu de o valoare
• are operații specifice pentru biți
constructori