Documente Academic
Documente Profesional
Documente Cultură
Partea 1
Cuprins
STL (Standard Template Library) ce include siruri containere standard sumar vectori liste tablouri asociative tablouri asociative cu chei multiple
D. Lucanu
STL Partea 1
STL::continut
biblioteci C <cstring> <cstdlib> etc siruri ca obiecte <string> containere <vector> <list> <queue> <stack> <map> etc
D. Lucanu STL Partea 1
STL::continut (cont.)
iteratori <iterator>
etc
etc
D. Lucanu
STL Partea 1
Un text simplu.
15
$tag$
tag
5
D. Lucanu STL Partea 1
Un text simplu.
15 22 21
tag
D. Lucanu
5
STL Partea 1
STL::containere::definitie
un obiect care contine alte obiecte (componentele) si are metode de accesare a componentelor fiecare container are asociat un tip iterator cu ajutorul caruia se "merge" prin container
Iterator
D. Lucanu
STL Partea 1
STL::secvente
<vector> suporta acces aleator la elemente, timp constant pentru insertie si eliminarea componentelor de la sfarsit, timp liniar pentru inserarea si eliminarea elementelor de la inceput si interior <list> suporta parcurgerea in ambele sensuri, timp constant (amortizat) pentru insertie si eliminare la inceput, la sfarsit sau in interior <deque> suporta acces (inserare si eliminare) la ambele capete <queue> suporta inserare la un capat si eliminare la celalalt capat <stack> suporta inserarea si eliminarea la acelasi capat etc
D. Lucanu STL Partea 1
STL::containere asociative
suporta cautarea eficienta bazata pe chei <map> componentele sunt perechi <cheie, data> cu cheie unica (nu exista doua date cu aceeasi cheie) <multimap> componentele sunt perechi <cheie, data> cu cheie multipla (pot exista mai multe date cu aceeasi cheie) <set> componentele sunt doar de tip cheie si NU pot exista in duplicat <multiset> componentele sunt doar de tip cheie si POT exista in duplicat etc
D. Lucanu
STL Partea 1
10
STL::containere:: iteratori
definitie: sint utilizati pentru a naviga prin containeri, fara sa stim ce tip de data este utilizat pentru memorarea obiectelor concepte cheie: elementul curent la care face referire (p->, *p) elementul urmator/precedent (++p, --p) comparatii (< <= ==) alti iteratori begin() end() rbegin() // reverse begin rend() // reverse end
D. Lucanu STL Partea 1
11
STL::containere:: iteratori
O clasificare a iteratorilor iteratori cu acces aleator == != < > >= <= ++ -- + - += -= *p= -> [] =*p
== != ++ -- *p=
-> =*p
== != ++ *p= -> =*p iteratori de intrare: == != ++ -> =*p iteratori de iesire: ++ *p=
D. Lucanu
STL Partea 1
12
iterator constant: obiectul referit poate fi accesat dar nu se poate atribui o noua valoare prin acest iterator
exemplu
VectIntConstIt q;
vectInt.erase(q); // error: no matching function ... VectIntIt p; vectInt.erase(p); // OK
D. Lucanu
STL Partea 1
13
D. Lucanu
STL Partea 1
14
D. Lucanu
STL Partea 1
15
16
17
STL::containere:: constructori
container() containerul vid container(n) containerul cu n elemente cu valoare implicita container(n, x)(nu pt asociative) containerul cu n copii ale lui x container(first, last) containerul cu elemente din intervalul [first, last) container(c) constructorul de copiere ~container() destructor
D. Lucanu STL Partea 1
18
STL::containere:: atribuiri
operator=(c) copie din containerul c assign(n) //(nu pentru asociative) atribuie n elemente cu valoare implicita assign(n, x) //(nu pentru asociative) atribuie n copii ale lui x assign(first, last) atribuie din intervalul [first, last)
D. Lucanu
STL Partea 1
19
20
STL::vector:: declarare
template <class T, class A = allocator<T>> class std::vector { public: typedef T data_type; //. . . iterator begin(); //. . . }
D. Lucanu STL Partea 1
21
STL::vector:: reprezentare
size rep
elemente spatiu extra
D. Lucanu
STL Partea 1
22
vector::exemplu::agenda telefonica
vector <T>
Intrare
AgTel
D. Lucanu
STL Partea 1
23
vector::exemplu::agenda telefonica
header #include <vector> intrare in agenda = structura class Intrare { public: Intrare(char *un_s="\0", long un_n=0); void afiseaza() const; ... private: string nume; long nr; };
24
vector::exemplu::agenda telefonica
declarare agenda typedef vector<Intrare> AgTel; AgTel agTel(20);
adaugarea de intrari pe pozitii aleatoare agTel[0] = Intrare("Ionescu", 123456); agTel[10] = Intrare("Popescu", 654321);
D. Lucanu
STL Partea 1
25
STL::vector::agenda telefonica
realizarea unei copii AgTel copie = agTel; accesul la componente copie[0].afiseaza(); copie[10].afiseaza();
D. Lucanu
STL Partea 1
26
STL::vector::agenda telefonica
D. Lucanu
STL Partea 1
27
STL::vector::agenda telefonica
nu afiseaza nimic
D. Lucanu
STL Partea 1
28
STL::vector::agenda telefonica
D. Lucanu
STL Partea 1
29
STL::containere::liste:: declarare
template <class T, class A = allocator<T>> class std::list { public: typedef T value_type; //. . . iterator begin(); //. . . }
D. Lucanu STL Partea 1
30
STL::containere::liste::reprezentare
rep
elemente
D. Lucanu
STL Partea 1
31
liste::exemplu::agenda telefonica
list<T>
Intrare
AgTel
D. Lucanu
STL Partea 1
32
STL::liste::agenda telefonica
header #include <list> declarare agenda typedef list<Intrare> AgTel; AgTel agTel; typedef AgTel::iterator AgTelIterator;
D. Lucanu
STL Partea 1
33
STL::liste::agenda telefonica
adaugarea unei intrari la inceput Intrare x("Ionescu", 123456); agTel.push_front(x);
parcurgerea agendei for (AgTelIterator i=agTel.begin(); i!=agTel.end();++i) cout << (*i).getNume() << (*i).getNr();
34
Acelasi program poate merge la fel debine daca schimbam listele cu vectorii Demo (stdlib3.cpp, stdlib3_1.cpp)
D. Lucanu
STL Partea 1
35
36
rep ...
D. Lucanu
STL Partea 1
37
declarare agenda cheia = numele data = numarul de telefon map<string, long> agTel;
38
parcurgere agenda for (MI p=agTel.begin(); p!=agTel.end(); ++p) cout << p->first << ' ' << p->second; modificarea numarului lui Ionescu agTel["Ionescu"] = 567890;
D. Lucanu
STL Partea 1
39
STL::perechi
template<class T, class U> struct pair { typedef T first_type; typedef U second_type T first; U second; pair(); pair(const T& x, const U& y); template<class V, class W> pair(const pair<V, W>& pr); };
D. Lucanu STL Partea 1
40
D. Lucanu
STL Partea 1
41
MI q = agTel.find("Ropescu"); if ( q == agTel.end()) { cout << "Nu este in carte." << endl; } else { agTel.erase(q); }
D. Lucanu
STL Partea 1
42
STL::containere::multimap:: declarare
template <class Key, class T, class Cmp = less<Key>, class A = allocator<T>> class std::multimap { public: typedef T value_type; //. . . iterator insert(const value_type&); //. . . }
D. Lucanu
STL Partea 1
43
STL::multimap:: reprezentare
rep ...
D. Lucanu
STL Partea 1
44
STL::multimap::exemplu::ag.tel
45
STL::multimap::exemplu::ag.tel
sterge toti Popestii agTel.erase(string("Popescu")); cauta si sterge numai primul Popescu q = agTel.find(string("Popescu")); if ( q != agTel.end()) { agTel.erase(q); }
D. Lucanu
STL Partea 1
46
STL::multimap::exemplu::ag.tel
declarare iteratori typedef multimap<string, long>::iterator MI; MI p, q; afisarea numai a Popestilor MI p, q; p = agTel.find(string("Popescu")); if ( p != agTel.end()) do { cout << p->first << ' ' << p->second; ++p; } while ((p != agTel.end()) && \ (p->first == Popescu"));
47
STL::multimap::exemplu::ag.tel
creeaza o agenda numai cu Popestii p = agTel.lower_bound(string("Popescu")); q = agTel.upper_bound(string("Popescu")); multimap<string, long> temp(p, q); mai eficient: pair<MI, MI> pit = agTel.equal_range(string("Popescu")); p = pit.first; q = pit.second; afiseaza agenda temporara for (p = temp.begin(); p != temp.end(); ++p) cout << p->first << ' ' << p->second;
D. Lucanu STL Partea 1
48