Sunteți pe pagina 1din 37

STANDARD TEMPLATE

LIBRARY

CURS 11 - PROGRAMARE II

1
CUPRS ANTERIOR
Tipuri de date abstracte

Tipuri de date generice

Funcii ablon

Clase ablon

2
REZOLVARE TEST
Fie urmtorul cod:
template <class T1> T1 max(T1 a, T1 b) {
return a>b?a:b;
}
class NrRational {
int numitor, numarator;
};
int main(){
NrRational r1(7,8), r2(1,2);
cout << max(r1, r2);
}
Ce metode trebuie adugate la clasa NrRational astfel nct programul
de mai sus s se execute?

3
REZOLVARE TEST
- Constructor cu doi parametrii
- Pentru crearea obiectelor
- NrRational::NrRational(int x, int y) {
this->numarator=x;
this->numitor=y;
}
- Suprancrcarea operatorului >
- Pentru compararea din functia max
- bool NrRatinal::operator >(const NrRational &a, const NrRational &b){
return ((float)a.numarator)/a.numitor >((float)b.numarator)/b.numitor;
}
- Suprancrcarea operatorului <<
- Pentru afisarea
- ostream & operator<<(ostream &s, const NrRational &a){
s << a.numarator << \ << a.numitor;
return s;
}

4
CUPRINS
Introducere n Stanard Template Library

Containere secveniale

Containere asociative

Adaptori ai containerelor

Algoritmi

Bitset

5
CARACTERISTICI UNEI
BIBLIOTECI GENERICE
Refolosire
Posibilitatea de a opera cu tipuri de date definite de
utilizator

Compoziia
Posibilitatea de a opera cu tipuri de date definite n alt
bibliotec

Eficiena
Performane mai bune dect implementrile non-generice
(codificrii personale)

6
CE OFER BIBLIOTECILE
STANDARD N C++?
Ofer suport pentru proprietile limbajului (gestionarea memoriei, RTTI)

Ofer informaii despre implementarea compilatorului (ex. cea mai mare


valoare pentru numere de tip float)

Ofer funcii care nu pot fi implementate optimal n limbaj pentru orice


sistem (sqrt, memmove, etc)

Ofer suport pentru lucrul cu iruri de caractere i streamuri (include


suport pentru internaionalizare i localizare)

Ofer un framework pentru containere (vector, map,) i algoritmi


generici pentru ele (parcurgere, sortare, reuniune, )

Suport pentru prelucrii numerice (numere complexe, BLAS=Basic Liniar


Algebra Subprograms etc.)

7
Ofer o baz pentru alte biblioteci
STANDARD TEMPLATE
LIBRARY - STL
STL, biblioteca standard a limbajului C++ ofer cele mai
uzuale structuri de date i algoritmi fundamentali pentru
utilizarea lor

Prima bibliotec generic a C++ folosit pe scar larg

Coninutul biblioteci STL


Containere
Iteratori
Algoritmi

Performan
Msurat prin benckmarks de penalitate

8
DE CE S FOLOSIM STL?
Micoreaz timpul de implementare
Structuri de date deja implementate i testate

Cod mai uor de citit

Robusteea
Structurile STL sunt actualizate automat

Cod portabil

Mentenabilitatea codului

Uurin

9
CONTAINERE
Definiie
Un container este un obiect care conine obiecte

Exemple:
list, vector, stack, etc

Avantaje containere
Simple i eficiente
Fiecare container are ataat o mulime de operaii comune
iterarori standard sunt disponibili pentru fiecare container
Type-safe i homogeni
Sunt non-intrusive (ex. un obiect nu are nevoie de o clas de
baz pentru a fi membru a unui container )

10
EXEMPLU PROGRAM
#include <map>
#include <string>
map<string,float> price;
price[snapple] = 0.75;
price[coke] = 0.50;
string item;
double total=0;
while ( cin >> item )
total += price[item];
EXEMPLU PROGRAM
#include <map>
#include <string>
map<string,float> price;
price[snapple] = 0.75;
price[coke] = 0.50;
string item;
double total=0;
while ( cin >> item )
total += price[item];
EXEMPLU PROGRAM
#include <map>
#include <string>
map<string,float> price;
price[snapple] = 0.75;
price[coke] = 0.50;
string item;
double total=0;
while ( cin >> item )
total += price[item];
CONTAINERE
Tipuri de containere
Containere secveniale
Structuri de date liniare (vector, link list)
Containere first-class
Containere asociative
Structuri de date non-liniare, pot identifica rapid elemente
Perechi cheie/valoare
Containere first-class
Adaptorii ai containerelor
Containre obinute prin adaptarea unor containre
secveniale
Containere near
Asemntoare cu containerele, dar cu funcionalitate redus
Pot fi folosite cu iteratorii cea ce le face accesibile manipulri
algoritmilor definii n STL

14
CONTAINERE
Containere secveniale
vector
deque
list

Containere asociative
set
multiset
map
multimap

Adaptori ai containerelor
stack
queue
priority_queue

Containre near
string
bitset
valaray

15
FUNCII MEMBRE COMUNE
PENTRU CONTAINER
Funcii membre pentru toate containerele
Constructor implicit (default), constructor de copiere,
destructor
empty
max_size, size
= < <= > >= == !=

Funcii pentru containere


begin, end
rbegin, rend
erase, clear

16
ITERATORI
Iteratori asemntori cu ponteri
Pointeaz spre primul element al unui container
Operatori comuni pentru toate containerele
* defereniere
++ pointez spre urmtorul element
begin() ntoarce un iterator sper primul element
end() ntoarce un iterator sper ultimul element

Utilizare iteratori cu secvene it


Containere
Secvene de intrare; istream_iterator
Secvene de ieire: ostream_iterator

17
ITERATORI
Utilizare
std::istream_iterator< int > inputInt( cin )
Poate citi intrri de la cin
*inputInt
Defereniat pentru a citi primul int de la cin
++inputInt
Trece la urmtorul int din flux (stream)

std::ostream_iterator< int > outputInt(cout)


Poate scrie int la cout
*outputInt = 7
Afieaz 7 la cout
++outputInt
Avanseaz iteratorul astfel nct s se poat afia urmtorul
int

18
ITERATORI. EXEMPLU
#include <iostream>
#include <iterator> // ostream_iterator i isteam_iterartor
using namespace std;

int main()
{
cout << "Introdu 2 intregi: ";
istream_iterator <int> inputInt (cin);
int nr1 = *inputInt;
++inputInt;
int nr2 = *inputInt;

ostream_iterator <int> outputInt (cout);


cout<< "rezultatul este: ";
*outputInt = nr1 + nr2;
cout<<endl;
}

19
TIPURI DE ITERATORI
Intrare (input)
Citete elemente dintr-un container, se poate deplasa doar
nainte
Ieire (output)
Scrie elemente ntr-un container, se poate deplasa doar
nainte
naintare (forward)
Combin iteratori de intrare i ieire
Pot parcurge o secven de mai multe ori
Bidirecionali
La fel ca cei de naintare, dar se pot deplasa i n sens invers
Acces aleatoriu (random)
La fel ca cei bidirecionali dar pot sri i la orice element

20
TIPURI DE ITERATORI
SUPORTAI DE COTAINERE
Containere secveniale
vector: acces aleator
deque: acces aleator
list: bidirecional

Containere asociative (pt. toate acces bidirecional)


set
multiset
map
Multimap

Adaptori ai containerelor (nu au iteratori ataai)


stack
queue
priority_queue

21
ITERATORI OPERAII
Toi Iteratori de naintare
++p, p++ Conin operaiile iteratorilor
de intrare i ieire
Iteratori de intrare
*p
Bidirecionali
p = p1 --p, p
p == p1, p != p1
Acces aleatoriu
Iteratori de ieire p + i, p += i
*p p - i, p -= i
p = p1 p[i]
p < p1, p <= p1
p > p1, p >= p1

22
ALGORITMI
Algoritmi STL utilizai de obicei mpreun cu containerele
Opereaz cu elementele containrelor indirect prin
intermediul iteratorilor

De multe ori opereaz pe secvene de operatori


Perechi de operatori
Primul i ultimul element

De multe ori ntorc iteratori


Ex: find()
ntr-un iterator la un element al secvenei sau end() dac nu
este gsit

Economisesc timpul i efortul necesar implementri lor

23
MODELUL
Algoritmi
sort, find, search, copy, Separarea conceptelor
Algoritmi manipuleaz
datele, dar nu tiu despre
containere
Iteratori
Containerele
depoziteaz datele, dar
nu tiu despre algoritmi
Algoritmi i containerele
Containere interacioneaz prin
vector, list, map, hash_map, intermediul iteratorilor
Fiecare container are
un iterator

24
CONTAINERE
SECVENIALE
vector
0 1 2 3

list
(dublu
nlanuit) 0 1 2

set 6
(un fel de
arbore) 2 7

0 1 5

3 4
CONTAINERUL LIST
Containerul list
Header <list>

Adugare/tergere eficient oriunde n container

Liste dublu nlnuite

Iteratori bidirecionali

Utilizare
std::list < tip > nume;

26
CONTAINERUL LIST
Funcii ataate unui obiect, T, de tip list
T.sort ()
Sortare n ordine cresctoare

T.splice (iterator, altObiect)


Insereaz valorile din variabila altObiect naintea
iterarorului

T.merge (altObiect)
terge altObiect i l insereaz n T sortat

T.unique()
terge elementele duplicate

27
CONTAINERUL LIST
Funcii ataate unui obiect, T, de tip list
T.swap (altObiect)
Interschimb coninutul

T.assign (iterator1, iterator2)


nlocuiete coninutul cu elementele din domeniul
iteratorului

T.remove (valoare)
terge toate instanele valorii valoare

28
VECTOR
Header <vector>
Tablou dinamic
Inserare/ tergere rapid de la sfritul tabloului
reverse(), capacity()
Blocuri continue de memorie
Accesarea elementelor folosind []
Crete cu un anumit factor atunci cnd mrimea (size())
depete capacitatea (capacity())
Aloc o zon de memorie continu mai mare
Face o copie a lui nsui
Dealoc vechea memorie
Iteratori de acces aleatori

29
VECTOR
Declarare
std::vector < tip > variabila;
Iteratori
std::vector <tip>::const_iterator iterVar;
Nu poate modifica valorile elementelor
std::vector <tip>::reverse_iterator iterVar;
Parcurge elementele in ordine invers
Pentru a obine punctul de nceput se folosete rbegin
Pentru a obine punctul de sfrit se folosete rend
Std::ostream_iterator <tip> nume (outputStream,
separator)
Separator caracter care separ ieirile

30
VECTOR
Funcii
V.push_back(valoare)
Adaug un element la sfritul vectorului
V.size()
Dimensiune actual a vectorului
V.capacity()
Ct de multe elemente poate s conin vectorul nainte
de a fi redimensionat
La realocare spaiul se dubleaz
vector<type> v(array, array+ SIZE)
Creat un vector v cu elementele tabloului a pan la
array+SIZE

31
VECTOR
Funcii
V.insert (iterator, valoare)
Insereaz valoarea naintea locaiei iteratorului
V.insert (iterator, array, array+SIZE)
Insereaz un tablou de elemente naintea poziiei
iteratorului
V.erase( iterator)
terge elementul din container
V.erase( iterator1, iterato2)
terge elementele ncepnd cu iterator1 pn la iterator2
V.clear()
terge ntreg containerul

32
VECTOR
Funcii
V.front(), V.back()
Returnez primul, ultimul element al vectorului

V[elementnumber] = valoare
Atribuie valoarea elementului

V.at( elementnumber ) = valoare


Atribuie valoarea elementului, verific corectitudinea
indexului
Excepie out_of_bounds

33
PARCURGERE VECTOR
for(int i = 0; i<v.size(); ++i) // de ce int?
// utilizare v[i]
for(vector<int>::size_type i = 0; i<v.size(); ++i) // mai
lung dar ntotdeauna corect
// utilizare v[i]
for(vector<int>::iterator p = v.begin(); p!=v.end(); ++p)
// utilizare *p

Toate variantele sunt corecte


Nu exist avantaje fundamentale ale unei abordri
Cea care folosete iterator este comun pentru toate
containerele
Prefer size_type in loc de int pentru a mpiedica erori rare

34
DEQUE
Coad cu intrri n ambele pri

Inserare rapid la nceputul i sfritul cozi

35
SET
Mulime list de elemente sortate

Regsire rapid pe baza chei (log N)

Adugare / tergere rapid

set
Stocare sub form de arbore balansat

36
MAP
List sortat de perechi (cheie, valoare)

Implementare asemntoare cu set

map

37

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