Sunteți pe pagina 1din 13

9.

Standard Template Library (STL)


Obiective
- nelegerea noiunii de container i folosirea containerilor STL
- Folosirea algoritmilor STL n programe
- nelegerea modului n care algoritmii folosesc iteratori pentru a accesa
elementele unui container STL

- Introducere
Pe lng avantajele oferite de posilibatea de a menine i nelege mai uor
aplicaiile, programarea orientat pe obiecte l ofer pe acela al reutilizrii codului.
C++ standard include o bibliotec standard care cuprinde o colecie foarte
cuprinztoare de componente reutilizabile. Vom introduce n acest capitol Standard
Template Library (STL) i vom prezenta cele trei componente cheie ale acestei
biblioteci: containerii (structuri de date sub form de template-uri), iteratorii i
algoritmii. Deoarece STL cuprinde foarte multe clase, vom prezenta doar o parte
dintre acestea nsoite de cteva exemple.
n anii 70, componentele folosite n programe erau sub forma structurilor de
control i a funciilor. n anii 80, au nceput s se foloseasc componente sub form
de clase dintr-o gam larg de biblioteci dependente de platform. n ultima parte a
anilor 90, odat cu apariia STL se introduce un nou nivel de folosire a
componentelor prin clase independente de platform, fiind de ateptat ca n urmtorii
ani numrul acestor clase s creasc exponenial.
Structurile de date sunt colecii de date sau containeri organizate dup diverse
reguli. n programarea orientat pe obiecte, structurile de date sunt obiecte care
conin colecii de obiecte. S presupunem ca implementm o clas Array care ar
reprezenta un tablou de obiecte de tip int. Folosind template-uri, am putea extinde
acest tip de dat la Array<T> astfel nct s putem implementa Array<char>,
Array<double>, Array<Employee> sau, n general, tablouri de orice tip de dat.
n mod similar putem proceda pentru implementarea structurilor de date de tip stiv
sau pentru alte tipuri de structuri de date. STL este o bibliotec de clase template
care conine, ntre altele, i implementri ale structurilor de date.
n C i C++ obinuim s accesm elementele unui tablou folosind pointeri. n
C++ STL, accesm elementele containerilor prin obiecte iterator care arat ca
pointerii, dar se comport mai inteligent. Clasele iterator sunt proiectate s poat fi
folosite generic pentru orice container. Containerii implementeaz operaii primitive,
iar algoritmii STL sunt implementai independent de containeri.
Containerii STL sunt unul dintre cele mai bune exemple de reutilizare a codului
i de folosire a claselor template. Implementrile structurilor de date care fac
legturile ntre obiecte prin pointeri pot conduce la probleme serioare legate de
gestiunea dinamic a memoriei, erori care nu pot fi detectate la compilare i care
sunt uneori foarte dificil de rezolvat. Unul dintre marile avantaje ale containerilor STL
este c rezolv aceste neajunsuri.
STL evit folosirea motenirii i a funciilor virtuale din considerente de
performan. De asemenea, STL evit folosirea operatorilor new i delete n
favoarea alocatorilor pentru a permite o mai mare varietate de metode de control al
alocrii i dealocrii memoriei.

Programarea calculatoarelor i limbaje de programare II

Containeri
Containerii STL sunt de trei tipuri: containeri secven, containeri asociativi i
adaptori container.

Containerii secven
- vector fiierul header <vector> implementarea unui tablou dinamic, cu
redimensionare automat la inserarea unui nou element sau la tergerea unui
element;
- list fiierul header <list> - list dublu nlnuit cu inserare i tergere
rapid;
- deque fiierul header <deque> - coad n care elementele pot fi adugate sau
terse din ambele capete; difer de coada obinuit prin faptul c acolo
adugarea i tergerea elementelor se face la un singur capt.

Containerii asociativi
- map fiierul header <map> pstreaz asocieri ntre perechi de valori i chei,
mapare unu-la-unu;
- multimap fiierul header <map> este similar cu map, dar accept duplicate,
mapare unu-la-mai multe;
- set fiierul header <set> cheile sunt chiar valorile pstrate;
- multiset fiierul header <set> este similar cu set, dar accept duplicate.

Adaptori container
- stack fiierul header <stack> implementeaz o stiv last-in-first-out
(LIFO);
- queue fiierul header <queue> implementeaz o coad first-in-first-out
(FIFO);
- priority_queue fiierul header <queue> coad n care elementul cu
prioritatea cea mai mare este ntotdeauna primul element extras.
Coninutul tuturor fiierelor header face parte din namespace std. Containerii
secven i cei asociativi sunt grupai generic sub denumirea first-class containers.
Containerii STL au fost proiectai n aa fel nct dispun de o serie de funcionaliti
comune. Iat cteva dintre acestea:
- constructor implicit;
- constructor de copiere;
- destructor;
- empty funcie care returneaz true dac sunt elemente n container i false
n caz contrar;
- operator=;
- operator<;
- operator<=;
- operator>;
- operator>=;
- operator==;
- operator!=;
- erase funcie care terge unul sau mai multe elemente din container (doar n
first-class containers);
2

Programarea calculatoarelor i limbaje de programare II

- clear funcie care terge toate elementele din container (doar n first-class
containers).
Atunci cnd decidem s folosim un container, este important s ne asigurm c
tipul de dat elementelor care urmeaz a fi stocate n container dispune de un set
minim de funcionaliti. La inserarea unui element ntr-un container se face o copie a
acestuia, de aceea tipul de dat al elementului trebuie s dispun de un constructor
de copiere i de un operator de asignare.

Iteratori
Iteratorii au multe caracteristici comune cu pointerii i sunt folosii, printre altele,
pentru a pointa la elemente ale containerilor de tip first-class. Un iterator este un
obiect care permite programatorului s parcurg toate elementele unei colecii,
indiferent de implementarea acesteia. Exist iteratori STL a cror implementare este
adaptat unor anumii containeri. Sunt, ns, iteratori care pot opera asupra tuturor
containerilor. De exemplu, operatorul de derefereniere * se poate aplica unui iterator
pentru a folosi elementul asupra cruia pointeaz. Operatorul ++ aplicat unui iterator
mut poziia iteratorului asupra urmtorului element din container.
Folosim iteratorii mpreun cu secvenele. Secvenele pot fi organizate n
containeri sau pot fi secvene de intrare ori ieire. Programul de mai jos
demonstreaz citirea datelor folosind istream_iterator de la intrarea standard
care poate fi privit ca o secven de date de intrare n program. Programul
ilustreaz, de asemenea, tiprirea datelor folosind ostream_iterator la ieirea
standard care poate fi privit ca o secven de date de ieire din program. Programul
citete de la tastatur doi ntregi i afieaz suma lor.
Exemplu
test_iostream_iterators.cpp
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
#include <iterator>
int main()
{
cout << "Introduceti doua numere intregi: ";
std::istream_iterator<int> inputInt(cin);
int number1, number2;
number1 = *inputInt; //citeste primul int
++inputInt;
//muta iteratorul pe urmatoarea valoare
number2 = *inputInt; //citeste urmatorul int
cout << "Suma este: ";
std::ostream_iterator<int> outputInt(cout);
*outputInt = number1 + number2; //tiparire la cout
cout << endl;
return 0;
3

Programarea calculatoarelor i limbaje de programare II

}
Rulnd acest program, putem obine urmtorul rezultat:
Introduceti doua numere intregi: 12 25
Suma este: 37
Prin instruciunea
std::istream_iterator<int> inputInt(cin);
se creeaz un iterator de tip istream_iterator care este capabil s extrag valori
de tip int de la dispozitivul standard de intrare cin ntr-o manier sigur.
Prin dereferenierea iteratorului inputInt se citete prima valoare ntreag din
cin:
number1 = *inputInt; //citeste primul int
Operaia ++inputInt mut iteratorul pe urmtoarea valoare din secvena de
date de intrare.
Prin declaraia
std::ostream_iterator<int> outputInt(cout);
se creeaz un iterator de tip ostream_iterator prin care se insereaz valori de tip
int la ieirea standard cout.
Asignarea
*outputInt = number1 + number2;
permite tiprirea sumei celor doi ntregi derefereniind iteratorul outputInt.
Atunci cnd containerul conine elemente ale cror valori pot fi modificate
putem folosi i iteratorul iterator, iar dac elementele nu pot fi modificate folosim
const_iterator.
Categoriile de iteratori folosii n STL sunt urmtoarele:
- input pentru citirea unui element dintr-un container;
- output pentru scrierea unui element ntr-un container;
- forward combin capacitile primelor dou categorii de iteratori;
- bidirectional - combin capacitile unui iterator forward cu posibilitatea de a se
deplasa n ambele direcii;
- random-access - combin capacitile iteratorului bidirectional cu posibilitatea de
a accesa direct un element din container, adic de a se deplasa inainte sau napoi
cu un numr arbitrar de elemente.
Operaiile care pot fi folosite de un iterator sunt urmtoarele (operaiile pentru
un iterator le includ pe toate cele precedente):
Toi iteratorii
- ++p preincrementarea unui iterator
- p++ postincrementarea unui iterator
Iteratorii de tip input
- *p dereferenierea unui iterator pentru a fi folosit ca rvalue
- p = p1 asignarea unui iterator altui iterator
- p == p1 compararea iteratorilor pentru egalitate
- p != p1 compararea iteratorilor pentru inegalitate
Iteratorii de tip output
- *p dereferenierea unui iterator pentru a fi folosit ca lvalue
Iteratorii de tip forward
- --p predecrementarea unui iterator
- p-- postdecrementarea unui iterator
Iteratorii de tip random-access
4

Programarea calculatoarelor i limbaje de programare II

- p += i incrementarea iteratorului p cu i poziii


- p -= i decrementarea iteratorului p cu i poziii
- p + i iteratorul este poziionat la p incrementat cu i poziii
- p - i iteratorul este poziionat la p decrementat cu i poziii
- p[i] returneaz o referin la elementul deplasat de la p cu i poziii
- p < p1 returneaz true dac iteratorul p este naintea lui p1 n container
- p <= p1 returneaz true dac iteratorul p este naintea lui p1 sau pe aceeai
poziie n container
- p > p1 returneaz true dac iteratorul p este dup p1 n container
- p >= p1 returneaz true dac iteratorul p este dup p1 sau pe aceeai poziie
n container.

Algoritmi
Un aspect esenial al STL este c ofer algoritmi care pot fi folosii generic
pentru o mare varietate de containeri: inserare, tergere, cutare, sortare etc. STL
include aproximativ 70 de algoritmi standard. Algoritmii opereaz asupra elementelor
unei secvene doar indirect, prin intermediul iteratorilor. Deoarece STL este
extensibil, se pot aduga cu uurin noi algoritmi fr a opera nicio modificare
asupra containerilor. Algoritmii pot opera i asupra tablourilor declarate n formatul
promovat de limbajul C ca pointeri.
Algoritmii STL sunt de dou tipuri. Cei de tip mutating-sequence fac modificri
asupra containerilor pe care sunt aplicati, n timp ce algoritmii non-mutatingsequence se execut fr a schimba coninutul containerilor.
Civa dintre algoritmii care fac parte din fiierul header <numeric> sunt:
- copy();
- fill();
- replace();
- swap();
- count();
- find();
- search().

- Containeri secven
C++ STL ofer trei containeri secven: vector, list i deque. Clasele
vector i deque se bazeaz pe tablouri. Clasa list implementeaz o structur de
dat de tip list nlnuit.
Unul dintre cei mai folosii containeri este vector care este o implementare a
unui tablou. Spere deosebire de tablourile simple din C++, acestea pot fi asignate
unui altuia, i, suplimentar, clasa vector verific ncadrarea indicilor n limite.
Pe lng operaiile comune tuturor containerilor, unii dintre acetia
implementeaz i operaii suplimentare. Containerii secven dispun de operaiile:
- front returnarea unei referine la primul element din container;
- back returnarea unei referine la ultimul element din container;
- push_back inserarea unui element nou pe ultima poziie din container;
- pop_back tergerea ultimului element din container.
Vom prezenta n programele de mai jos cteva dintre funcionalitile claselor
vector i list.

Programarea calculatoarelor i limbaje de programare II

Containerul secven vector


Un vector (tablou) este o structur de dat n care datele sunt stocate ntr-o
zon contigu de memorie. Aceast organizare a datelor permite accesul direct la
elementele vectorului prin operatorul []. Atunci cnd memoria obiectului de tip
vector nu mai este suficient, se aloc o zon mai mare de memorie contigu, se
copiaz elementele originale n noua zon de memorie i se dealoc vechea zon de
memorie.
O caracteristic important a oricrui container este tipul de iterator pe care l
suport. Acesta determin ce algoritmi pot fi aplicai containerului. Un vector
suport iteratorul random-access, adic poate fi folosit mpreun cu orice operator
prezentat mai devreme. Toi algoritmii STL pot opera asupra unui vector. Iteratorii
pentru un vector sunt implementai ca pointeri la elementele vectorului. Dac un
algoritm are nevoie de un anumit tip de iterator pentru a funciona, atunci containerul
asupra cruia se aplic trebuie s poat lucra cel puin cu acel tip de iterator.
Exemplul urmtor prezint cteva dintre funcionalitile clasei template
vector, multe dintre aceste funcii fiind ns utilizabile de orice container STL de tip
first-class.
Exemplu
test_vector.cpp
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
#include <vector>
int main()
{
const int SIZE = 6;
int a[SIZE] = {1, 2, 3, 4, 5, 6};
std::vector<int> v;
cout << "Dimensiunea initiala a lui v este: " << v.size()
<< "\nCapacitatea initiala a lui v este: "
<< v.capacity();
v.push_back(2); //metoda push_back se gaseste
v.push_back(3); //in orice colectie secventa
v.push_back(4);
cout << "\nDimensiunea lui v este: " << v.size()
<< "\nCapacitatea lui v este: " << v.capacity();
cout << "\n\nContinutul tabloului folosind notatia pointer: ";
for(int *ptr = a; ptr != a + SIZE; ++ptr)
cout << *ptr << ' ';
cout << "\nContinutul vectorului v folosind iteratorul: ";
std::vector<int>::const_iterator p1;
for(p1 = v.begin(); p1 != v.end(); p1++)
cout << *p1 << ' ';
cout << "\nContinutul inversat al vectorului v: ";
6

Programarea calculatoarelor i limbaje de programare II

std::vector<int>::reverse_iterator p2;
for(p2 = v.rbegin(); p2 != v.rend(); ++p2)
cout << *p2 << ' ';
cout << endl;
return 0;
}
Rulnd acest program, obinem urmtorul rezultat:
Dimensiunea initiala a lui v este: 0
Capacitatea initiala a lui v este: 0
Dimensiunea lui v este: 3
Capacitatea lui v este: 4
Continutul tabloului folosind notatia pointer: 1 2 3 4 5 6
Continutul vectorului v folosind iteratorul: 2 3 4
Continutul inversat al vectorului v: 4 3 2
Prin instruciunea
std::vector<int> v;
se declar obiectul v din clasa vector care poate pstra valori int. Odat cu
instanierea acestui obiect, se creeaz un vector vid de dimensiune 0, adic numrul
de elemente stocate n acel moment este 0, i capacitate 0, adic numrul de
elemente fr alocare de memorie este 0. Apelurile de funcii v.size() i
v.capacity() returneaz aceste dou valori.
Funcia push_back insereaz o valoare n container. Dac se insereaz o
valoare ntr-un vector plin, dimensiunea acestuia crete automat. Un nou apel al
funciilor v.size() i v.capacity() ilustreaz aceast modificare a dimensiunii
i a capacitii vectorului.
Pentru afiarea coninutului obiectului v n ordine, se instaniaz obiectul p1 de
tip const_iterator. Funcia v.begin() returneaz un const_iterator la
primul element din v, v.end() returneaz un const_iterator care indic poziia
de dup ultimul element din v, iar operaia p1++ poziioneaz iteratorul pe urmtorul
element din v. Afiarea valorii de la poziia curent a iteratorului se face prin
dereferenierea acestuia: *p1.
Afiarea valorilor n ordine invers se face cu ajutorului obiectului p2 de tip
reverse_iterator. Funcia v.rbegin() returneaz un iterator la punctul de start
pentru iterarea n ordine invers , iar v.end() returneaz un iterator la punctul de
terminare a iterrii n ordine invers.
Urmtorul program prezint funcii care permit diverse manipulri ale valorilor
unui obiect de tip vector.
Exemplu
test_vector_manipulation.cpp
#include <iostream>
using std::cout;
using std::endl;
#include <iterator>
#include <vector>

Programarea calculatoarelor i limbaje de programare II

#include <algorithm>
#include <exception>
int main()
{
const int SIZE = 6;
int a[SIZE] = {1, 2, 3, 4, 5, 6};
std::vector<int> v(a, a+SIZE);
std::ostream_iterator<int> output(cout, " ");
cout << "Vectorul v contine: ";
std::copy(v.begin(), v.end(), output);
cout << "\nPrimul element din v: " << v.front()
<< "\nUltimul element din v: " << v.back();
v[0] = 7;
v.at(2) = 10;
v.insert(v.begin()+1, 22);
cout << "\nContinutul vectorului v dupa modificari: ";
std::copy(v.begin(), v.end(), output);
try
{
v.at(100) = 725;
}
catch(std::exception& e)
{
cout << "\nExceptie: " << e.what();
}
v.erase(v.begin());
cout << "\nContinutul vectorului v dupa stergere: ";
std::copy(v.begin(), v.end(), output);
v.erase(v.begin(), v.end());
cout << "\nDupa stergere, vectorul v "
<< (v.empty() ? "" : "nu ") << "este vid";
v.insert(v.begin(), a, a+SIZE);
cout << "\nContinutul vectorului v inainte de stergere: ";
std::copy(v.begin(), v.end(), output);
v.clear();
cout << "\nDupa stergere, vectorul v "
<< (v.empty() ? "" : "nu ") << "este vid";
cout << endl;
return 0;
}
Rulnd acest program, obinem urmtorul rezultat:
Vectorul v contine: 1 2 3 4 5 6
Primul element din v: 1
8

Programarea calculatoarelor i limbaje de programare II

Ultimul element din v: 6


Continutul vectorului v dupa modificari: 7 22 2 10 4 5 6
Exceptie: vector::_M_range_check
Continutul vectorului v dupa stergere: 22 2 10 4 5 6
Dupa stergere, vectorul v este vid
Continutul vectorului v inainte de stergere: 1 2 3 4 5 6
Dupa stergere, vectorul v este vid
Prin instruciunea
std::vector<int> v(a, a+SIZE);
se declar un vector v cu elemente de tip int. Se apeleaz un constructor
suprancrcat al acestei clase care primete dou argumente. Pointerii la un tablou
pot fi folosii ca iteratori, astfel c prin aceasta declaraie vectorul v este iniializat cu
coninutul tabloului a, de la locaia a pn la a+SIZE, fr s o includ i pe aceasta.
Prin
std::ostream_iterator<int> output(cout, " ");
se definete un ostream_iterator cu numele output care poate fi folosit pentru
afiarea la cout a unor valori ntregi separate prin spaiu.
Algoritmul copy din STL este invocat prin apelul
std::copy(v.begin(), v.end(), output);
pentru a trimite ctre output coninutul vectorul v dintre v.begin() i v.end().
Primii doi parametri sunt iteratori ale cror valori sunt citite dintr-un container, iar
ultimul parametru este un iterator de ieire. Pentru a putea apela aceast funcie,
trebuie inclus fiierul header <algorithm> n codul surs.
Liniile de program
v[0] = 7;
v.at(2) = 10;
ilustreaz dou moduri n care se pot accesa elementele unui obiect de tip vector.
Spre deosebire de operatorul [], funcia at verific dac indicele de tablou care este
trimis ca parametru se ncadreaz ntre limitele acestuia. n caz contrar, este
generat o excepie care poate fi tratat astfel:
try
{
v.at(100) = 725;
}
catch(std::exception& e)
{
cout << "\nExceptie: " << e.what();
}
Pentru a putea rula corect codul de tratare a excepiei, programul trebuie s includ
fiierul header <exception>.
Funcia
v.insert(v.begin()+1, 22);
este o variant de insert care poate fi folosit pentru containerii secven i care
insereaz valoarea 22 nainte de elementul a crui poziie este specificat prin
iteratorul din primul argument. n exemplul nostru, iteratorul pointeaz ctre al doilea
element din vectorul v, iar valoarea 22 este inserat pe a doua poziie. Elementul
care se gsea nainte pe cea de-a doua poziie devine astfel al treilea element din
vector, iar toate celelalte elemente sunt deplasate cu o poziie. Instruciunea
v.insert(v.begin(), a, a+SIZE);
9

Programarea calculatoarelor i limbaje de programare II

este o alt variant a acestei funcii care insereaz o mulime de valori dintr-o
secven pentru care se precizeaz poziia de nceput i cea de sfrit dintr-un alt
container. n exemplul nostru, se insereaz elementele dintre a i a+SIZE din tabloul
a.
Funciile
v.erase(v.begin());
v.erase(v.begin(), v.end());
indic faptul c elementul de la locaia specificat sau elementele dintre cele dou
locaii sunt terse din colecie. Funcia
v.clear();
terge ntreg coninutul vectorului v.

Containerul secven list


Lista nlnuit este o structur de dat n care elementele sunt organizate sub
forma unei colecii liniare de obiecte numite noduri care sunt interconectate prin
legturi de tip pointer. O list nlnuit este accesat printr-un pointer la primul nod
al listei. Nodurile urmtoare sunt accesate prin legtura pe care fiecare nod o are
ctre nodul urmtor din list. Prin convenie, ultimul nod al listei nlnuite nu are un
element urmtor, iar pointerul su de legtur are valoarea NULL. ntr-o list dublu
nlnuit, fiecare nod are cte dou legturi, una ctre elementul urmtor i alta
ctre elementul precedent.
Containerul secven list este o implementare a listei dublu nlnuite. Acest
container suport, astfel, iteratori bidirecionali care permit parcurgerea sa n ambele
sensuri. Orice algoritm care are nevoie de iteratori de tip input, output, forward sau
bidirectional pot opera asupra unei liste.
Pe lng funciile membre specifice tuturor containerilor i cele ale containerilor
secven, clasa list dispune i de urmtoarele opt funcii membre: splice,
push_front, pop_front, remove, unique, merge, reverse i sort.
Programul de mai jos prezint cteva dintre funcionalitile clasei list. Pentru
a folosi aceast clas, programul trebuie s includ fiierul header <list>.
Exemplu
test_list.cpp
#include <iostream>
using std::cout;
using std::endl;
#include <list>
#include <algorithm>
#include <iterator>
template <class T>
void printList(const std::list<T> &listRef);
int main()
{
const int SIZE = 4;
int a[SIZE] = {2, 4, 6, 8};
std::list<int> values, otherValues;
values.push_front(1);
10

Programarea calculatoarelor i limbaje de programare II

values.push_front(2);
values.push_back(4);
values.push_back(3);
cout << "lista values contine: ";
printList(values);
values.sort();
cout << "\ndupa sort lista values contine: ";
printList(values);
otherValues.insert(otherValues.begin(), a, a+SIZE);
cout << "\ndupa insert lista otherValues contine: ";
printList(otherValues);
values.splice(values.end(), otherValues);
cout << "\ndupa splice lista values contine: ";
printList(values);
values.sort();
cout << "\ndupa sort lista values contine: ";
printList(values);
otherValues.insert(otherValues.begin(), a, a+SIZE);
otherValues.sort();
cout << "\nlista otherValues contine: ";
printList(otherValues);
values.merge(otherValues);
cout << "\ndupa merge:\n lista values contine: ";
printList(values);
cout << "\n lista otherValues contine: ";
printList(otherValues);
values.pop_front();
values.pop_back();
cout << "\ndupa pop_front si pop_back lista values contine: ";
printList(values);
values.unique();
cout << "\ndupa unique, lista values contine: ";
printList(values);
//metoda swap poate fi folosita de toti containerii
values.swap(otherValues);
cout << "\ndupa swap:\n lista values contine: ";
printList(values);
cout << "\n lista otherValues contine: ";
printList(otherValues);
values.assign(otherValues.begin(), otherValues.end());
cout << "\ndupa assign lista otherValues contine: ";
printList(values);
values.merge(otherValues);
11

Programarea calculatoarelor i limbaje de programare II

cout << "\ndupa merge lista values contine: ";


printList(values);
values.remove(4);
cout << "\ndupa remove lista values contine: ";
printList(values);
cout << endl;
return 0;
}
template <class T>
void printList(const std::list<T> &listRef)
{
if(listRef.empty())
cout << "Lista este goala";
else
{
std::ostream_iterator<T> output(cout, " ");
std::copy(listRef.begin(), listRef.end(), output);
}
}
Rulnd acest program, obinem urmtorul rezultat:
lista values contine: 2 1 4 3
dupa sort lista values contine: 1 2 3 4
dupa insert lista otherValues contine: 2 4 6 8
dupa splice lista values contine: 1 2 3 4 2 4 6 8
dupa sort lista values contine: 1 2 2 3 4 4 6 8
lista otherValues contine: 2 4 6 8
dupa merge:
lista values contine: 1 2 2 2 3 4 4 4 6 6 8 8
lista otherValues contine: Lista este goala
dupa pop_front si pop_back lista values contine: 2 2 2 3 4 4 4
6 6 8
dupa unique, lista values contine: 2 3 4 6 8
dupa swap:
lista values contine: Lista este goala
lista otherValues contine: 2 3 4 6 8 2 3 4 6 8
dupa assign lista otherValues contine: 2 3 4 6 8
dupa merge lista values contine: 2 2 3 3 4 4 6 6 8 8
dupa remove lista values contine: 2 2 3 3 6 6 8 8
n acest program se instaniaz dou liste cu elemente de tip int, denumite
values i otherValues:
std::list<int> values, otherValues;
Instruciunea push_front insereaz o valoare la nceputul listei, iar
instruciunea push_back adaug valori la sfritul su:
values.push_front(1);
values.push_front(2);
values.push_back(4);
12

Programarea calculatoarelor i limbaje de programare II

values.push_back(3);
Dup aceste patru operaii de inserare, lista values conine patru valori ordonate
astfel: 2 1 4 3.
Funcia membr sort fr niciun argument realizeaz o ordonare cresctoare
a valorilor din list:
values.sort();
Dup apelul acestei funcii, elementele din list se vor regsi n ordinea 1 2 3 4.
Funcia
values.splice(values.end(), otherValues);
terge elementele din otherValues i le insereaz n values nainte de poziia
specificat de iteratorul care este primul argument su. n exemplul nostru, iteratorul
este values.end(), iar valorile din otherValues sunt adugate la sfritul listei
values. Dup acest operaie, lista values va conine valorile 1 2 3 4 2 4 6 8.
Funcia
values.merge(otherValues);
terge toate elementele din otherValues i le insereaz sortate n lista values.
Ambele liste trebuie sortate n aceeai ordine nainte de a realiza aceast operaie.
n exemplul nostru, inaintea operaiei merge lista values conine valorile 1 2 2 3
4 4 6 8, iar lista otherValues conine valorile 2 4 6 8. Dup apelul funciei,
lista values va conine valorile 1 2 2 2 3 4 4 4 6 6 8 8, iar otherValues
va fi vid.
Funcia pop_front terge primul element din list, iar pop_back terge
ultimul element din list.
Instruciunea
values.unique();
terge elementele duplicate din list. Pentru a garanta tergerea tuturor duplicatelor
din list, aceasta trebuie sortat n prealabil pentru ca valorile care se repet s se
gseasc pe poziii alturate.
Linia
values.swap(otherValues);
folosete funcia swap pentru a interschimba coninutul listei values cu coninutul
listei otherValues.
Instruciunea
values.assign(otherValues.begin(), otherValues.end());
folosete funcia assign pentru a nlocui coninutul vectorului values cu coninutul
din otherValues din domeniul specificat de cei doi iteratori care sunt argumente
ale funciei.
Prin apelul funciei remove cu argumentul 4:
values.remove(4);
sunt terse toate apariiile lui 4 din lista values.

13

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

  • OrCAD Capture
    OrCAD Capture
    Document8 pagini
    OrCAD Capture
    AlexandruDîrlău
    Încă nu există evaluări
  • Dioda Zener
    Dioda Zener
    Document5 pagini
    Dioda Zener
    Marian Baciu
    Încă nu există evaluări
  • 11 Autocorelatie
    11 Autocorelatie
    Document24 pagini
    11 Autocorelatie
    Ştefan Pruteanu
    Încă nu există evaluări
  • LASD1v8 PDF
    LASD1v8 PDF
    Document403 pagini
    LASD1v8 PDF
    AlexandruDîrlău
    Încă nu există evaluări
  • Programare 8
    Programare 8
    Document12 pagini
    Programare 8
    AlexandruDîrlău
    Încă nu există evaluări
  • Subcircuite Spice
    Subcircuite Spice
    Document4 pagini
    Subcircuite Spice
    AlexandruDîrlău
    Încă nu există evaluări
  • PCLP2 Capitolul7
    PCLP2 Capitolul7
    Document11 pagini
    PCLP2 Capitolul7
    AlexandruDîrlău
    Încă nu există evaluări
  • PCLP2 Capitolul4
    PCLP2 Capitolul4
    Document14 pagini
    PCLP2 Capitolul4
    AlexandruDîrlău
    Încă nu există evaluări
  • Cap6 AOC Memoria
    Cap6 AOC Memoria
    Document40 pagini
    Cap6 AOC Memoria
    Florescu Gabriel
    Încă nu există evaluări
  • PCLP2 Capitolul6
    PCLP2 Capitolul6
    Document12 pagini
    PCLP2 Capitolul6
    AlexandruDîrlău
    Încă nu există evaluări
  • PCLP2 Capitolul3
    PCLP2 Capitolul3
    Document19 pagini
    PCLP2 Capitolul3
    AlexandruDîrlău
    Încă nu există evaluări
  • PCLP2 Capitolul2
    PCLP2 Capitolul2
    Document11 pagini
    PCLP2 Capitolul2
    Ady Sin
    Încă nu există evaluări
  • PCLP2 Capitolul4
    PCLP2 Capitolul4
    Document14 pagini
    PCLP2 Capitolul4
    AlexandruDîrlău
    Încă nu există evaluări
  • PCLP2 Capitolul5
    PCLP2 Capitolul5
    Document12 pagini
    PCLP2 Capitolul5
    AlexandruDîrlău
    Încă nu există evaluări
  • PCLP2 Capitolul5
    PCLP2 Capitolul5
    Document12 pagini
    PCLP2 Capitolul5
    AlexandruDîrlău
    Încă nu există evaluări
  • PCLP2 Capitolul2
    PCLP2 Capitolul2
    Document11 pagini
    PCLP2 Capitolul2
    Ady Sin
    Încă nu există evaluări
  • PCLP2 Capitolul3
    PCLP2 Capitolul3
    Document19 pagini
    PCLP2 Capitolul3
    AlexandruDîrlău
    Încă nu există evaluări
  • Matrice C++
    Matrice C++
    Document2 pagini
    Matrice C++
    AlexandruDîrlău
    Încă nu există evaluări
  • PCLP2 Capitolul1
    PCLP2 Capitolul1
    Document13 pagini
    PCLP2 Capitolul1
    Emanuel Emy Gavrilă
    Încă nu există evaluări
  • 2014 2015 PCLP1 - Tema2 PDF
    2014 2015 PCLP1 - Tema2 PDF
    Document2 pagini
    2014 2015 PCLP1 - Tema2 PDF
    AlexandruDîrlău
    Încă nu există evaluări
  • Laborator 4
    Laborator 4
    Document11 pagini
    Laborator 4
    Cosmin Telescu
    Încă nu există evaluări
  • Laborator 4
    Laborator 4
    Document11 pagini
    Laborator 4
    Cosmin Telescu
    Încă nu există evaluări
  • Memoria Interna
    Memoria Interna
    Document12 pagini
    Memoria Interna
    mirelairimia
    Încă nu există evaluări
  • Matrice C++
    Matrice C++
    Document2 pagini
    Matrice C++
    AlexandruDîrlău
    Încă nu există evaluări
  • Cap6 AOC Memoria
    Cap6 AOC Memoria
    Document40 pagini
    Cap6 AOC Memoria
    Florescu Gabriel
    Încă nu există evaluări
  • Cap6 AOC Memoria
    Cap6 AOC Memoria
    Document40 pagini
    Cap6 AOC Memoria
    Florescu Gabriel
    Încă nu există evaluări
  • Matrice C++
    Matrice C++
    Document2 pagini
    Matrice C++
    AlexandruDîrlău
    Încă nu există evaluări
  • T2 DeCo Dec 2014 PDF
    T2 DeCo Dec 2014 PDF
    Document11 pagini
    T2 DeCo Dec 2014 PDF
    AlexandruDîrlău
    Încă nu există evaluări
  • T6 DeCo Dec 2014
    T6 DeCo Dec 2014
    Document9 pagini
    T6 DeCo Dec 2014
    AlexandruDîrlău
    Încă nu există evaluări