Sunteți pe pagina 1din 48

STL

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>

algoritmi <algorithm> <cstdlib>


intrari/iesiri <iostream> <istream>

etc

etc

D. Lucanu

STL Partea 1

STL:: siruri::exemplu simplu


header #include <string> spatiul de nume using namespace std; declaratii siruri string s("Un text simplu."); string tag("$tag$");

Un text simplu.

15
$tag$

tag

5
D. Lucanu STL Partea 1

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();

Un text foarte simplu.

Un text simplu.

15 22 21

Un text $tag$ simplu. $tag$

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

Container 1 1 * Componenta 0..*

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

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

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

iteratori bidirectionali iteratori forward

== != ++ -- *p=

-> =*p

== != ++ *p= -> =*p iteratori de intrare: == != ++ -> =*p iteratori de iesire: ++ *p=

D. Lucanu

STL Partea 1

12

STL::iteratori constanti si mutabili

iterator constant: obiectul referit poate fi accesat dar nu se poate atribui o noua valoare prin acest iterator

typedef vector<int>::const_iterator VectIntConstIt;

Iterator mutable: sunt posibile ambele actiuni (acces si atribuire valoare)

typedef vector<int>::iterator VectIntIt;

exemplu

VectIntConstIt q;
vectInt.erase(q); // error: no matching function ... VectIntIt p; vectInt.erase(p); // OK

D. Lucanu

STL Partea 1

13

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 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 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


c.size() c.empty() c.capacity() c.reserve(n) c.resize() // 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 mai mare // vector posibil swap(c1, c2) // intershimba continuturile a 2 containere == // testul de egalitate != // testul diferit < // relatia de ordine lexicografica
D. Lucanu STL Partea 1

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

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::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; };

D. Lucanu STL Partea 1

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

declarare tip iteratori typedef AgTel::iterator AgTelIterator; AgTelIterator i;

afisare agenda for (i = agTel.begin(); i != agTel.end(); ++i) i->afiseaza();

D. Lucanu

STL Partea 1

27

STL::vector::agenda telefonica

Combinatie nefericita intre acces direct si iteratori


agTel.clear(); agTel[0] = Intrare("Ionescu", 123456); agTel[10] = Intrare("Popescu", 654321); for (i=agTel.begin(); i != agTel.end(); ++i) i->afiseaza();

nu afiseaza nimic

D. Lucanu

STL Partea 1

28

STL::vector::agenda telefonica

Recomandare: utilizeaza numai iteratori!


agTel.clear(); agTel.push_back(Intrare("Ionescu", 123456)); agTel.push_back(Intrare("Popescu", 654321)); for (i=agTel.begin(); i != agTel.end(); ++i) i->afiseaza();

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);

adaugarea unei intrari la sfarsit Intrare y("Popescu", 654321); agTel.push_back(y);

parcurgerea agendei for (AgTelIterator i=agTel.begin(); i!=agTel.end();++i) cout << (*i).getNume() << (*i).getNr();

D. Lucanu STL Partea 1

34

STL:: liste sau vectori?

Acelasi program poate merge la fel debine daca schimbam listele cu vectorii Demo (stdlib3.cpp, stdlib3_1.cpp)

D. Lucanu

STL Partea 1

35

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 Partea 1

37

STL::tablouri asociative::ag. tel.


header #include <map>

declarare agenda cheia = numele data = numarul de telefon map<string, long> agTel;

adaugarea de intrari dupa cheie agTel["Ionescu"] = 123456; agTel["Popescu"] = 654321;

D. Lucanu STL Partea 1

38

STL::tablouri asociative::ag. tel.


declarare iterator typedef map<string, long>::const_iterator MI;

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

STL::tablouri asociative ::ag. tel.


inserare ca pereche pair <MI, bool> pb = \ agTel.insert(make_pair(string("Zorzonel"),\ 123543)); if (pb.second) { cout << "Zorzonel a fost inserat."; } else { cout << "Zorzonel este deja inserat."; }

D. Lucanu

STL Partea 1

41

STL::tablouri asociative ::ag. tel.

cauta in agenda si elimina (daca gaseste)

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 ...

perechi (cheie, val)

D. Lucanu

STL Partea 1

44

STL::multimap::exemplu::ag.tel

header #include <map>

declarare agenda telefonica cheia = numele data = numarul de telefon


std::multimap<string, long> agTel; inserare const string ionescu("Ionescu"); agTel.insert(agTel.end(), \ make_pair(ionescu, 123543));
D. Lucanu STL Partea 1

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"));

D. Lucanu STL Partea 1

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

S-ar putea să vă placă și