Sunteți pe pagina 1din 35

STANDARD TEMPLATE LIBRARY

CURS 11 - PROGRAMARE II

CUPRS ANTERIOR
Tipuri de date abstracte Tipuri de date generice Funcii ablon Clase ablon

CUPRINS
Introducere n Stanard Template Library Containere secveniale Containere asociative Adaptori ai containerelor Algoritmi Bitset

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)

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 prelucri numerice (numere complexe, BLAS=Basic Liniar Algebra Subprograms etc.) 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

DE CE S FOLOSIM STL?
Micoreaz timpul de implementare Structuri de date deja implementate si testate Cod mai uor de citit Robusteea Structurile STL sunt actualizate automat Cod portabil Mentenabilitatea codului Uurin

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-save i homogeni Sunt non-intrusive (ex. un obiect nu are nevoie de o clas de baz pentru a fi membru a unui container )

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
Non+liniari, pot identifica rapid elemente Perechi cheie/valoare Containere first-class

Adaptorii ai containerelor Containere near Asemntoare cu containerele, dar cu funcionalitate redus

12

CONTAINERE
Containere secveniale vector deque list Containere asociative set multiset map multimap

Adaptori ai containerelor stack queue priority_queue

13

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

14

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

Utilizare iteratori cu secvene


Containere Secvene de intrare; istream_iterator Secvene de ieire: ostream_iterator

it

15

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

16

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

17

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

18

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

19

ITERATORI OPERAII
Toi
++p, p++

Iteratori de naintare
Conin operalile iteratori de intrare i ieire

Iteratori de intrare
*p p = p1 p == p1, p != p1

Bidirecionali
--p, p

Acces aleatoriu
p + i, p += i p - i, p -= i p[i] p < p1, p <= p1 p > p1, p >= p1

Iteratori de ieire
*p p = p1

20

ALGORITMI
Algoritmi STL utilizai de obicei mpreun cu containerele Opereaz cu elementele indirect prin intermediul iteratorilor De multe ori opereaz pe secvene de operatori
Perechi de operatori Primul i ultimul element

De multe ori ntorc iteratori


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

Economisesc timpul i efortul necesar implementri lor

21

MODELUL
Algoritmi

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
sort, find, search, copy,

22

CONTAINERE SECVENIALE
vector
0 1 2 3

list
(dublu nlanuit)
0 1 2

set
(un fel de arbore)
0 2 1

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

24

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

25

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

26

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

27

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

28

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

29

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

30

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

31

PARCURGERE VECTOR
for(int i = 0; i<v.size(); ++i)
// utilizare v[i]

// de ce int? // mai

for(vector<int>::size_type i = 0; i<v.size(); ++i) 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

32

DEQUE
Coad cu intrri n ambele pri Inserare rapid la nceputul i sfritul cozi

33

SET
Mulime list de elemente sorate Regsire rapid pe baza chei (log N) Adugare / tergere rapid Stocare sub form de arbore balansat
set

34

MAP
List sortat de perechi (cheie, valoare) Implementare asemntoare cu set

map

35

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