You are on page 1of 6

Mihai TOGAN

Cap. 10 – Standard Template Library (STL)

Obiective:
 Standard Template Library overview
 Exemple

1
Mihai TOGAN
Standard Template Library overview

 Este o colecţie de clase (container, string), iteratori și algoritmi deja implementaţi


 Include clase de tip container: liste, vectori, map-uri, hash-map-uri, set-uri, queue-uri,
stack-uri, etc.
 Include clasa string: alocarea automată de spaţiu, căutari, concatenări, etc.
 Include algoritmi dedicaţi şi optimizaţi pentru sortări, căutări, rotaţii, merge-uri, min/max,
etc.

 Acum, este inclus deja ȋn standardul de C++ (C++ Standard Library).


 Necesită folosirea namespace-ului std.
 Clasele și funcțiile care implementează algoritmi sunt bazate ȋn general pe template-uri.

Exemplul 1:
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;

void main()
{
set<int> iset;

iset.insert(5);
iset.insert(9);
iset.insert(1);
iset.insert(8);
iset.insert(3);

cout << "iset contine:";


set<int>::iterator it;
for(it=iset.begin(); it != iset.end(); it++)
cout << " " << *it;

cout << endl;


cout << "Introduceti valoarea cautata: ";
int searchFor;
cin >> searchFor;

if(binary_search(iset.begin(), iset.end(), searchFor))


cout << "S-a gasit valoarea: " << searchFor << endl;
else
cout << "Nu s-a gasit valoarea: " << searchFor << endl;

cout << endl;


}

2
Mihai TOGAN
Cateva explicaţii privind secvenţa de cod prezentată mai sus:
 A fost creat un set (multime de elemente) de tip <int>.
 A fost inserată o serie de elemente ȋn multime.
 A fost creat iteratorul it (pentru iterarea elementelor mulţimii).
 Au fost afişate elementele mulţimii (s-a folosit iteratorul).
 Am căutat o valoare folosind ȋn acest sens un algoritm binar de căutare (clasa std::set
sortează automat elementele conţinute/inserate).
 Funcția (template) binary_search este parte din STL și implementează binenţeles operaţia
de căutare binară.

Iteratori
Toate clasele de tip container (list, vector, map, set, etc.) permit iterarea elementelor folosind
iteratori. Iteratorul este de fapt un pointer care permite parcurgerea elementelor unui
container.
Exemplu: std::vector<int>::iterator it;
Accesul la elemente se face folosind operatorul de dereferenţiere *it
Alte operaţii permise: it++, it--

Exemplul 2:
#include <iostream>
#include <algorithm>
using namespace std;

void printArray(const int arr[], const int len)


{
for(int i = 0; i < len; i++)
cout << " " << arr[i];
cout << endl;
}

void main()
{
int a[] = {5, 7, 2, 1, 4, 3, 6};

sort(a, a+7);
printArray(a, 7);

rotate(a,a+3,a+7); /* roteste la stanga intre a și a+7 (a+3 sa ajunga primul)


*/
printArray(a, 7);

reverse(a, a+7);
printArray(a, 7);

cout << endl;


}

3
Mihai TOGAN
Vectori

Echivalent cu un tablou C, însă cu spaţiu de memorie alocat dinamic (se face în mod
automat, la nevoie, fără intervenţia utilizatorului).

Exemplu:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

void main() {
vector<string> SS;
SS.push_back("The number is 10");
SS.push_back("The number is 20");
SS.push_back("The number is 30");

cout << "Loop by index:" << endl;


for(int ii=0; ii < (int) SS.size(); ii++)
cout << SS[ii] << endl;

cout << endl << "Constant Iterator:" << endl;


vector<string>::const_iterator cii;
for(cii=SS.begin(); cii!=SS.end(); cii++)
cout << *cii << endl;

cout << endl << "Reverse Iterator:" << endl;


vector<string>::reverse_iterator rii;
for(rii=SS.rbegin(); rii!=SS.rend(); ++rii)
cout << *rii << endl;

cout << endl << "Sample Output:" << endl;


cout << SS.size() << endl;
cout << SS[2] << endl;

swap(SS[0], SS[2]);
cout << SS[2] << endl << endl;
}

4
Mihai TOGAN
Exemplu: instanţierea unui vector de numere întregi:
#include <vector>
std::vector<int> int_list;
//...
int_list.push_back(1);
int tmp = int_list[0]; // tmp = 1
int_list.pop_back(); // int_list now empty

Liste
Reprezintă echivalentul listelor dublu înlănţuite.
Permit realizarea de diverse operaţii precum adăugarea/ştergerea de elemente, parcurgerea
(prin iteratori), obţinerea de elemente (prin iteratori), sortarea, curăţarea listei, etc.

Observaţie: nu este permisă accesarea elementelor prin indexare.

#include <iostream>
#include <list>
using namespace std;

void main()
{
std::list<int> int_list;
int_list.push_back(1);
int_list.push_back(2);
int_list.push_back(3);
cout << "Nr elemente din lista: " << int_list.size() << endl;

for (std::list<int>::iterator it = int_list.begin(); it != int_list.end();


it++)
{
cout << *it << " ";
}

cout << endl;

int_list.clear();
cout << "Nr elemente din lista: " << int_list.size() << endl;
cout << endl << endl;
}

5
Mihai TOGAN
Map –uri
Echivalente cu un dictionar (key <=> value) – implementare bazată pe arbori.
#include <map>

std::map<char, int> letter_to_int;
letter_to_int['a'] = 1;
letter_to_int['b'] = 2;
int pos = letter_to_int['a'] // pos = 1;

 Mai multe referinţe despre STL pot fi găsite la:


http://www.cplusplus.com/reference/stl/
http://www.cplusplus.com/reference/algorithm/

You might also like