STL Partea 1 1 Cuprins l l STL

  • Slides: 48
Download presentation
STL Partea 1 1

STL Partea 1 1

Cuprins l l STL (Standard Template Library) ce include siruri containere standard • sumar

Cuprins l l STL (Standard Template Library) ce include siruri containere standard • sumar • vectori • liste • tablouri asociative cu chei multiple D. Lucanu STL – Partea 1 2

STL: : continut l l l biblioteci C • <cstring> • <cstdlib> • etc

STL: : continut l l l biblioteci C • <cstring> • <cstdlib> • etc siruri ca obiecte • <string> containere • <vector> • <list> • <queue> • <stack> • <map> • etc D. Lucanu STL – Partea 1 3

STL: : continut (cont. ) l iteratori • <iterator> l algoritmi • <algorithm> •

STL: : continut (cont. ) l iteratori • <iterator> l algoritmi • <algorithm> • <cstdlib> l intrari/iesiri • <iostream> • <istream> • etc l etc D. Lucanu STL – Partea 1 4

STL: : siruri: : exemplu simplu header #include <string> l spatiul de nume using

STL: : siruri: : exemplu simplu header #include <string> l spatiul de nume using namespace std; l declaratii siruri string s("Un text simplu. "); string tag("$tag$"); l s tag Un text simplu. 15 $tag$ 5 D. Lucanu STL – Partea 1 5

STL: : siruri: : exemplu simplu operatii peste siruri s. insert(8, tag + '

STL: : siruri: : exemplu simplu operatii peste siruri s. insert(8, tag + ' '); int start = s. find(tag); s. replace(start, tag. size(), "foarte"); cout << s. c_str(); l Un text foarte simplu. s tag D. Lucanu Un text simplu. 15 22 21 Un text $tag$ simplu. $tag$ 5 STL – Partea 1 6

STL: : containere: : definitie l l un obiect care contine alte obiecte (componentele)

STL: : containere: : definitie l l 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 D. Lucanu STL – Partea 1 7

STL: : secvente <vector> suporta acces aleator la elemente, timp constant pentru insertie si

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 8

STL: : containere asociative suporta cautarea eficienta bazata pe chei <map> componentele sunt perechi

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 l D. Lucanu STL – Partea 1 9

STL: : containere: : tipuri asociate X: : value_type tipul obiectului memorat in container

STL: : containere: : tipuri asociate X: : value_type tipul obiectului memorat in container X: : allocator_type tipul managerului de memorie X: : size_type tip pentru indici, numar de elemente etc X: : iterator tip pentru iterator cu care se "merge" prin container etc D. Lucanu STL – Partea 1 10

STL: : containere: : iteratori l l l definitie: sint utilizati pentru a naviga

STL: : containere: : iteratori l l l 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 l O clasificare a iteratorilor • iteratori cu acces

STL: : containere: : iteratori l O clasificare a iteratorilor • iteratori cu acces aleator == != < > >= <= ++ -- + - += -= *p= -> [] =*p • iteratori bidirectionali == != ++ -- *p= • iteratori “forward” • • -> =*p == != ++ *p= -> =*p iteratori de intrare: == != ++ -> =*p iteratori de iesire: ++ *p= D. Lucanu STL – Partea 1 12

STL: : iteratori constanti si mutabili l iterator constant: obiectul referit poate fi accesat

STL: : iteratori constanti si mutabili l iterator constant: obiectul referit poate fi accesat dar nu se poate atribui o noua valoare prin acest iterator typedef vector<int>: : const_iterator Vect. Int. Const. It; l Iterator “mutable”: sunt posibile ambele actiuni (acces si atribuire valoare) typedef vector<int>: : iterator Vect. Int. It; l exemplu Vect. Int. Const. It q; vect. Int. erase(q); // error: no matching function. . . Vect. Int. It p; vect. Int. erase(p); // OK D. Lucanu STL – Partea 1 13

STL: : containere: : acces la elemente c. front() primul element c. back() ultimul

STL: : containere: : acces la elemente c. front() primul element c. back() ultimul element c[i] //(nu pentru liste) al i-lea element din secventa (NU se valideaza valoarea lui i) c. at(i) //(nu pentru liste) al i-lea element din secventa (SE valideaza valoarea lui i) D. Lucanu STL – Partea 1 14

STL: : operatii de tip stiva si coada c. push_back(x) insereaza x la sfarsit

STL: : operatii de tip stiva si coada c. push_back(x) insereaza x la sfarsit c. pop_back() elimina de la sfarsit c. push_front(x) insereaza x la inceput c. pop_front() elimina de la inceput D. Lucanu STL – Partea 1 15

STL: : containere: : operatii de tip lista c. insert(p, x) insereaza x inaintea

STL: : containere: : operatii de tip lista c. insert(p, x) insereaza x inaintea lui p c. insert(p, n, x) insereaza n copii ale lui x inaintea lui p c. insert(p, first, last) adauga elementele din [first, last) inaintea lui p c. erase(p) elimina de la p c. erase(first, last) elimina elementele din [first, last) c. clear() elimina toate elementele D. Lucanu STL – Partea 1 16

STL: : containere: : alte operatii // numarul de elemente // este c vid?

STL: : containere: : alte operatii // numarul de elemente // este c vid? // (numai pentru vector) spatiul alocat // (numai pentru vector) aloca spatiu // (numai pentru vector) adauga elemente la // sfarsit max_size() // (numai pentru vector) dim celui mare // vector posibil swap(c 1, c 2) // intershimba continuturile a 2 containere == // testul de egalitate != // testul diferit < // relatia de ordine lexicografica c. size() c. empty() c. capacity() c. reserve(n) c. resize() D. Lucanu STL – Partea 1 17

STL: : containere: : constructori container() containerul vid container(n) containerul cu n elemente cu

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)

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

STL: : containere: : operatii asociative operator[](k) acceseaza elementul cu cheia k find(k) gaseste

STL: : containere: : operatii asociative operator[](k) acceseaza elementul cu cheia k find(k) gaseste componenta cu cheia k lower_bound(k) gaseste primul element cu cheia k upper_bound(k) gaseste primul element cu cheia mai mare decat k equal_range(k) gaseste lower_bound() si upper_bound() pentru cheia k key_comp() componenta cheie value_comp() componenta valoare (data) D. Lucanu STL – Partea 1 20

STL: : vector: : declarare template <class T, class A = allocator<T>> class std:

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 D. Lucanu STL – Partea 1

STL: : vector: : reprezentare size rep elemente D. Lucanu STL – Partea 1 spatiu extra 22

vector: : exemplu: : agenda telefonica vector <T> Intrare > te tia an st

vector: : exemplu: : agenda telefonica vector <T> Intrare > te tia an st re> ra in << > << im po nt rt> > <I Ag. Te l D. Lucanu STL – Partea 1 23

vector: : exemplu: : agenda telefonica header #include <vector> l intrare in agenda =

vector: : exemplu: : agenda telefonica header #include <vector> l intrare in agenda = structura class Intrare { public: Intrare(char *un_s="", long un_n=0); void afiseaza() const; . . . private: string nume; long nr; }; l D. Lucanu STL – Partea 1 24

vector: : exemplu: : agenda telefonica declarare agenda typedef vector<Intrare> Ag. Tel; Ag. Tel

vector: : exemplu: : agenda telefonica declarare agenda typedef vector<Intrare> Ag. Tel; Ag. Tel ag. Tel(20); l l adaugarea de intrari pe pozitii aleatoare ag. Tel[0] = Intrare("Ionescu", 123456); ag. Tel[10] = Intrare("Popescu", 654321); D. Lucanu STL – Partea 1 25

STL: : vector: : agenda telefonica l realizarea unei copii Ag. Tel copie =

STL: : vector: : agenda telefonica l realizarea unei copii Ag. Tel copie = ag. Tel; l accesul la componente copie[0]. afiseaza(); copie[10]. afiseaza(); D. Lucanu STL – Partea 1 26

STL: : vector: : agenda telefonica l declarare tip iteratori typedef Ag. Tel: :

STL: : vector: : agenda telefonica l declarare tip iteratori typedef Ag. Tel: : iterator Ag. Tel. Iterator; Ag. Tel. Iterator i; afisare agenda for (i = ag. Tel. begin(); i != ag. Tel. end(); ++i) i->afiseaza(); l D. Lucanu STL – Partea 1 27

STL: : vector: : agenda telefonica l Combinatie nefericita intre acces direct si iteratori

STL: : vector: : agenda telefonica l Combinatie nefericita intre acces direct si iteratori ag. Tel. clear(); ag. Tel[0] = Intrare("Ionescu", 123456); ag. Tel[10] = Intrare("Popescu", 654321); for (i=ag. Tel. begin(); i != ag. Tel. end(); ++i) i->afiseaza(); l nu afiseaza nimic D. Lucanu STL – Partea 1 28

STL: : vector: : agenda telefonica l Recomandare: utilizeaza numai iteratori! ag. Tel. clear();

STL: : vector: : agenda telefonica l Recomandare: utilizeaza numai iteratori! ag. Tel. clear(); ag. Tel. push_back(Intrare("Ionescu", 123456)); ag. Tel. push_back(Intrare("Popescu", 654321)); for (i=ag. Tel. begin(); i != ag. Tel. end(); ++i) i->afiseaza(); D. Lucanu STL – Partea 1 29

STL: : containere: : liste: : declarare template <class T, class A = allocator<T>>

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

STL: : containere: : liste: : reprezentare rep elemente D. Lucanu STL – Partea 1 31

liste: : exemplu: : agenda telefonica list<T> Intrare > te tia an st re>

liste: : exemplu: : agenda telefonica list<T> Intrare > te tia an st re> ra in << > << im po nt rt> > <I Ag. Te l D. Lucanu STL – Partea 1 32

STL: : liste: : agenda telefonica header #include <list> l declarare agenda typedef list<Intrare>

STL: : liste: : agenda telefonica header #include <list> l declarare agenda typedef list<Intrare> Ag. Tel; Ag. Tel ag. Tel; typedef Ag. Tel: : iterator Ag. Tel. Iterator; l D. Lucanu STL – Partea 1 33

STL: : liste: : agenda telefonica adaugarea unei intrari la inceput Intrare x("Ionescu", 123456);

STL: : liste: : agenda telefonica adaugarea unei intrari la inceput Intrare x("Ionescu", 123456); ag. Tel. push_front(x); l adaugarea unei intrari la sfarsit Intrare y("Popescu", 654321); ag. Tel. push_back(y); l parcurgerea agendei for (Ag. Tel. Iterator i=ag. Tel. begin(); i!=ag. Tel. end(); ++i) cout << (*i). get. Nume() << (*i). get. Nr(); l D. Lucanu STL – Partea 1 34

STL: : liste sau vectori? l l Acelasi program poate merge la fel debine

STL: : liste sau vectori? l l Acelasi program poate merge la fel debine daca schimbam listele cu vectorii Demo (stdlib 3. cpp, stdlib 3_1. cpp) D. Lucanu STL – Partea 1 35

STL: : tablouri asociative (map): : declarare template <class Key, class T, class Cmp

STL: : tablouri asociative (map): : declarare template <class Key, class T, class Cmp = less<Key>, class A = allocator<T>> class std: : map { public: typedef T data_type; typedef pair<Key, T> value_type; //. . . iterator find(const key_type& k); //. . . } D. Lucanu STL – Partea 1 36

STL: : tablouri asociative: : reprezentare rep. . . perechi (cheie, data) D. Lucanu

STL: : tablouri asociative: : reprezentare rep. . . perechi (cheie, data) D. Lucanu STL – Partea 1 37

STL: : tablouri asociative: : ag. tel. header #include <map> l declarare agenda •

STL: : tablouri asociative: : ag. tel. header #include <map> l declarare agenda • cheia = numele • data = numarul de telefon map<string, long> ag. Tel; l adaugarea de intrari dupa cheie ag. Tel["Ionescu"] = 123456; ag. Tel["Popescu"] = 654321; l D. Lucanu STL – Partea 1 38

STL: : tablouri asociative: : ag. tel. declarare iterator typedef map<string, long>: : const_iterator

STL: : tablouri asociative: : ag. tel. declarare iterator typedef map<string, long>: : const_iterator MI; l l parcurgere agenda for (MI p=ag. Tel. begin(); p!=ag. Tel. end(); ++p) cout << p->first << ' ' << p->second; l modificarea numarului Ionescu ag. Tel["Ionescu"] = 567890; D. Lucanu STL – Partea 1 39

STL: : perechi template<class T, class U> struct pair { typedef T first_type; typedef

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

STL: : tablouri asociative : : ag. tel. inserare ca pereche pair <MI, bool>

STL: : tablouri asociative : : ag. tel. inserare ca pereche pair <MI, bool> pb = ag. Tel. insert(make_pair(string("Zorzonel"), 123543)); if (pb. second) { cout << "Zorzonel a fost inserat. "; } else { cout << "Zorzonel este deja inserat. "; } l D. Lucanu STL – Partea 1 41

STL: : tablouri asociative : : ag. tel. l cauta in agenda si elimina

STL: : tablouri asociative : : ag. tel. l cauta in agenda si elimina (daca gaseste) MI q = ag. Tel. find("Ropescu"); if ( q == ag. Tel. end()) { cout << "Nu este in carte. " << endl; } else { ag. Tel. erase(q); } D. Lucanu STL – Partea 1 42

STL: : containere: : multimap: : declarare template <class Key, class T, class Cmp

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. . . perechi (cheie, val) D. Lucanu STL

STL: : multimap: : reprezentare rep. . . perechi (cheie, val) D. Lucanu STL – Partea 1 44

STL: : multimap: : exemplu: : ag. tel l header #include <map> l declarare

STL: : multimap: : exemplu: : ag. tel l header #include <map> l declarare agenda telefonica • cheia = numele • data = numarul de telefon std: : multimap<string, long> l ag. Tel; inserare const string ionescu("Ionescu"); ag. Tel. insert(ag. Tel. end(), make_pair(ionescu, 123543)); D. Lucanu STL – Partea 1 45

STL: : multimap: : exemplu: : ag. tel l sterge toti Popestii ag. Tel.

STL: : multimap: : exemplu: : ag. tel l sterge toti Popestii ag. Tel. erase(string("Popescu")); l cauta si sterge numai primul Popescu q = ag. Tel. find(string("Popescu")); if ( q != ag. Tel. end()) { ag. Tel. erase(q); } D. Lucanu STL – Partea 1 46

STL: : multimap: : exemplu: : ag. tel declarare iteratori typedef multimap<string, long>: :

STL: : multimap: : exemplu: : ag. tel declarare iteratori typedef multimap<string, long>: : iterator MI; MI p, q; l afisarea numai a Popestilor MI p, q; p = ag. Tel. find(string("Popescu")); if ( p != ag. Tel. end()) do { cout << p->first << ' ' << p->second; ++p; } while ((p != ag. Tel. end()) && (p->first == Popescu")); l D. Lucanu STL – Partea 1 47

STL: : multimap: : exemplu: : ag. tel l creeaza o agenda numai cu

STL: : multimap: : exemplu: : ag. tel l creeaza o agenda numai cu Popestii p = ag. Tel. lower_bound(string("Popescu")); q = ag. Tel. upper_bound(string("Popescu")); multimap<string, long> temp(p, q); l mai eficient: pair<MI, MI> pit = ag. Tel. equal_range(string("Popescu")); p = pit. first; q = pit. second; l afiseaza agenda temporara for (p = temp. begin(); p != temp. end(); ++p) cout << p->first << ' ' << p->second; D. Lucanu STL – Partea 1 48