Sie sind auf Seite 1von 5

LUCRAREA DE LABORATOR NR7

Tema:
abloane
Scopul lucrrii:
Studierea necesitii abloanelor;
Studierea regulilor de definire i utilizare a abloanelor;
Studierea specializrii abloanelor;
Studierea potenialelor probleme rezolvate cu ajutorul abloanelor;
Noiuni generale
Motivarea
abloanele reprezint cea mai puternic construcia a limbajului C++, dar n acelai timp,
unul din cele mai puin studiate i rar utilizat. Cauza este ascuns n faptul c el este foarte
complicat i are o sintax neobinuit.
Aa deci, abloanele reprezint prin sine un mecanism ce permite s scrii un algoritm, care
nu este legat de un tip anumit. Cel mai des, abloanele sunt utilizate pentru crearea container i
algoritmi abstraci. Containerele sunt obiecte, care conin alte obiecte sau date, cel mai des o
cantitate nedeterminat, aa cum sunt masivele, stivele, liste asociative, etc. Prin algoritm
abstract este necesar de neles studierea bun a metodelor de prelucrare a datelor, ca sortarea,
cutarea, etc., nscrise fr prezentarea tipului datelor.
abloanele sunt clase i funcii. abloanele au venit sa schimbe macrourile, aa cum
ultimele foarte des duc la gsirea complicat a erorilor, deoarece compilatorul nu verific, dar
nici nu are posibilitatea s le verifice de erori sintactice.
Programatorul, scriind abloanele, creeaz aprovizionarea, care, ca urmare, se utilizeaz
deja cu tipurile de date specificate. Adic, la baza abloanelor compilatorul creeaz funcii
normale. Dac abloanele sunt utilizate cu cteva tipuri de date diferite, compilatorul creeaz un
codul necesar pentru fiecare tip n parte. Cu alte cuvinte, abloanele nu micoreaz compilarea
modulului, mai degrab chiar invers, dar simitor micoreaz codul de ieire, care duce la,
micorarea cantitii de erori, micoreaz introducerea modificrilor n cod i micoreaz
prezentarea programelor n general, aa cum se micoreaz calitatea tipurilor i funciilor date.
Definirea
abloanele sunt definite cu ajutorul cuvntului rezervat template:
template <class T>
T& searchmax(T* ptr, int size);
Template <class T>
class Stack{
T mas[10];
public:
...
};

Din exemplu se vede specificul definirii ablonului, pentru crearea lui este necesar de
prezentat template, n paranteze unghiulare cuvntul class1 i un tip abstract, care se va utiliza
n definirea ablonului. Istoric aa sa ntmplat, c cel mai des, se utilizeaz identificatorul T, de
la cuvntul type. Pentru clas, la definirea funciilor n afara clasei, nainte de fiecare funcie este
necesar de scris, din nou, cuvntul template.

n corespundere cu noile standarde, la fel poate fi utilizat typename n locul class.

Utilizarea
Funciile se utilizeaz practic aa ca i funciile obinuite.
void main(){
int
masi[10];
float masf[20];
cout<<searchmax(masi,10);
cout<<searchmax(masf,20);
}

Se vede c, sintaxa, apelrii coincide cu cele obinuite. Cunoscnd tipurile parametrilor


funciilor, compilatorul genereaz funcii obinuite. Dup care are posibilitatea s suprancarce
funcia. n cazul claselor lucrurile sunt puin mai complicate:
void main(){
Stack<int>
Stack<float>
}

sti;
stf;

Este necesar de prezentat tipul datelor, aa cum, n acest caz, la aceast etap de translare,
compilatorul nu este n stare s determine, pentru care tip de date este necesar de generat codul.
Specializarea
Cte odat nu ne satisface lucrul abloanelor pentru determinarea tipurilor datelor. Ca de
exemplu:
template <class T>
T& max(T& a, T& b){
if(a>b)return a;
return b;
}

Acest exemplu lucreaz excelent pentru tipurile ncorporate, aa ca int, float i altele. Dar
pentru iruri nu. Motivul const n aceia, c n acest caz se vor compara pointerii la iruri, dar
nu coninutul irului. Pentru alte tipuri de date, posibil nu este definit operatorul >. Rezolvri pot
fi cteva: se poate de interzis utilizarea pointerilor la iruri i s utilizezi tipul String, pentru care
este definit operatorul >, atunci n acest caz se complic procesul de dezvoltare i regulile de
utilizare. Mai mult ca att, interzicerea poate fi numai informativ, adic dac utilizatorul tie, c
nu trebuie de utilizat pointeri. nsi limbajul nu are posibilitatea s interzic utilizarea
specificrii unui tip de date special. Alt rezolvare const n utilizarea specializrii, care
reprezint nscrierea nc a unei funcii pentru un tip determinat. n cazul funciilor aceast de
obicei nu este o funcie ablon cu acelai nume i cu parametri predefinii. Aceast funcie poate
avea un avantaj mai mare dect abloanele. n cazul claselor se poate desigur de definit o clas
neablon cu acelai nume, dar aceasta nu este interesant, aa cum deosebirile pot fi minimale. n
acest caz poate fi utilizat specializarea metodei clasei. Specializat poate fi numai metoda definit
n afara clasei. Ca de exemplu:
template <class T>
class Stack{
public:
void push(T& t);
void sort();
friend ostream& operator<<(ostream& os, Stack<T>& s);
};
template <class T>
void Stack<T>::sort(){
...
// aici se nscrie un algoritm abstract

}
void Stack<char*>::sort(){
... // dar aici unul specializat
}
template <class T>
ostream& operator<<(ostream& os, Stack<T>& s){
return os; // afiarea coninutului stivei
}
void main(){
Stack<int> si;
si.push(5);
Stack<char*> sc;
sc.push("Hello");
si.sort();
// Apelarea funciei abstracte
sc.sort();
//Apelarea funciei specializate
cout<<si<<sc;
// Apelarea operatorului de suprancrcare a fluxului de ieire
}

abloanele clasei pot fi motenite, aa ca i cele obinuite, cu aceasta, i acel de baz, aa


i a cel derivat pot fi clase obinuite.
class One{
};
template <class T>
class Two: public One{
};
template <class T>
class Three: public Two<T>{
};
class Four: public Three<int>{
};
template <class T>
class Five: public T{
};

Un interes deosebit reprezint prin sine ultimul tip de motenire, aa cum are loc
motenirea de la parametrii ablonului. n acest caz T desigur nu trebuie s fie clas ori
structur.
Cum se vede din cele relatate mai sus, abloanele reprezint prin sine un mecanism
interesant i puternic. Sunt greuti i complicaii n studierea lor, dar ele se rscumpr, aa cum
permit crearea unui cod frumos i compact. Mai mult ca att, abloanele nu sunt realizate n alte
limbaje de programare moderne utilizate pe larg, dar la fel permit realizarea unor noi rezolvri
tehnice, aa cum pointeri detepi, susinerea tranzaciei, dirijarea memoriei, etc.
ntrebri de control:
1.
2.
3.
4.
5.
6.
7.
8.

Ce reprezint prin sine abloanele?


Care sunt avantajele utilizrii abloanelor?
Pentru ce se utilizeaz specializarea?
Ce poate fi un ablon?
Care sunt problemele utilizrii abloanelor?
Utilizarea abloanelor duce la economia memoriei?
Dar a timpului de executare a compilrii codului?
Poate o clas ablon s moteneasc una obinuit i invers?

Sarcina
Varianta 1
) Creai o funcie ablon, care schimb ordinea elementelor n felul urmtor: prima parte a listei
se amestec la urm, dar a doua la nceput. De exemplu: 1 2 3 4 5 6 - 4 5 6 1 2 3. Funcia
trebuie s lucreze cu masive de lungimi diferite. Dac numrul de elemente este impar, atunci
elementul mijlociu nu trebuie de prelucrat.
b) Creai clasa parametrizat Stack. Clasa trebuie s conin constructorii, destructorii, i
deasemenea funciile push, pop, empty, full i operatorii de intrare/ieire. Pentru alocarea
memoriei s se utilizeze operatorul new.
Varianta 2
) Creai o funcie ablon, care schimb ordinea elementelor dup perechi. De exemplu: 1 2 3 4
5 6 - 2 1 4 3 6 5. Funcia trebuie s lucreze cu masive de lungimi diferite. Dac numrul de
elemente este impar, atunci ultemul element nu trebuie de prelucrat.
b) Creai clasa parametrizat Vector. Clasa trebuie s conin constructorii, destructorii, i
deasemenea funciile getLength, operatorii [], +, - i operatorii de intrare/ieire. Pentru alocarea
memoriei s se utilizeze operatorul new.
Varianta 3
) Creai o funcie ablon, care calculeaz cantitatea de repetri a unui parametru n list. De
exemplu: lista - 0 2 3 4 3 6, parametrul - 3, rezultatul - 2. Funcia trebuie s lucreze cu masive de
lungimi diferite.
b) Creai clasele parametrizate List i ListItem. Clasa trebuie s conin constructorii, destructorii
i funciile add, in, remove, getLength, operatorii [] i operatorii de intrare/ieire.
Varianta 4
) Creai o funcie ablon, care caut o cheie dat. Funcia ntoarce poziia primului element
ntlnit. De exemplu: lista - 0 2 3 4 3 6, parametrul - 2, rezultatul - 1. n cazul cnd lipsete
elementul necesar s se ntoarc codul erorii. Funcia trebuie s lucreze cu masive de lungimi
diferite.
b) Creai clasa parametrizat Queue - coad. Clasa trebuie s conin constructorii, destructorii i
funciile add, in, get, getLength, operatorii [] i operatorii de intrare/ieire.
Varianta 5
) Creai o funcie ablon, care caut al doilea element dup dimensiune n elementele listei. De
exemplu: lista - 0 2 3 4 3 6, rezultatul - 4. Funcia trebuie s lucreze cu masive de lungimi
diferite.
b) Creai clasa parametrizat Set - mulimea. Clasa trebuie s conin constructorii, destructorii i
funciile add, in, remove, operatorii +, *,- i operatorii de intrare/ieire.
Varianta 6
) Creai o funcie ablon, de sortare n cretere dup metoda bulelor. Funcia trebuie s lucreze
cu masive de lungimi diferite.
b) Creai clasa parametrizat Map list asociativ, care conine cheia cmpului i valoarea.
Unei chei i corespunde o valoarea. Clasa trebuie s conin constructorii, destructorii i
funciile add, removeByKey, getLength, getByKey, getByValue, operatorii [] i operatorii de
intrare/ieire.

Varianta 7
) Creai o funcie ablon, care schimb dup perechi elementele masivelor n felul urmtor:
primul element va avea valoarea sumei perechii, dar al doilea diferenei perechii.
De exemplu: lista- 0 2 3 4 3 6, rezultatul 2 2 7 1 9 3.
b) Creai clasa parametrizat Matrix matrice. Clasa trebuie s conin constructorii, destructorii
i funciile getRows, getCols, operatorii [], +, -, * i operatorii de intrare/ieire.
Varianta 8
) Creai
o
funcie
ablon,
care
modific
ordinea
elementelor
invers.
De exemplu: 1 2 3 4 5 6 - 6 5 4 3 2 1. Funcia trebuie s lucreze cu masive de lungimi diferite.
b) Creai clasa parametrizat Tree arbore binar. Clasa trebuie s conin constructorii,
destructorii i funciile add, in, funcia de eludare a arborelului i operatorii de intrare/ieire.
Varianta 9
) Creai o funcie ablon, care calculeaz cantitatea de elemente, valoarea crora este mai mare
dect a parametrului dat. De exemplu: lista - 0 2 3 4 3 6, parametrul - 5, rezultatul - 1. Funcia
trebuie s lucreze cu masive de lungimi diferite.
b) Creai clasa parametrizat Stack. Clasa trebuie s conin constructorii, destructorii i
funciile push, pop, empty i operatorii de intrare/ieire. Pentru alocarea memoriei s se utilizeze
operatorul new, pe n elemente.
Varianta 10
) Creai o funcie ablon, de sortare a elementelor unui masiv n descretere prin metoda de
introducere. Funcia trebuie s lucreze cu masive de lungimi diferite.
b) Creai clasa parametrizat MultiMap list multi-asociativ, care conine cheia cmpurilor i
lista de valori. Adic, unei chei pot sa-i aparin mai multe valori. Clasa trebuie s conin
constructorii, destructorii i funciile add, removeByKey, getLength, getByKey, getByValue, i
operatorii [] i de intrare/ieire.
Varianta 11
) Creai o funcie ablon, care calculeaz cantitatea de elemente, valoarea crora este mai mic
dect a unui element dat. De exemplu: lista - 0 2 6 4 3 3, parametrul - 3, rezultatul - 2. Funcia
trebuie s lucreze cu masive de lungimi diferite.
b) Creai clasa parametrizat PriorityQueue coad cu prioritate. Fiecare element al cozii
conine o prioritate definit i la extragerea se alege un element cu un prioritate mai mare, dar
elementele cu prioriti asemntoare dup timpul adugrii. Clasa trebuie s conin
constructorii, destructorii i funciile add, in, get, getLength, i operatorii [] i de intrare/ieire.
Varianta 12
) Creai o funcie ablon, de cutare a elementului al doilea minimal dup mrime din
elementele listei. De exemplu: lista - 0 2 3 4 3 6, rezultatul - 2. Funcia trebuie s lucreze cu
masive de lungimi diferite.
b) Creai clasa parametrizat Matrix matrice. Clasa trebuie s conin constructorii, destructorii
i funciile getRows, getCols, operatorii [], +=, -=, *= i de intrare/ieire.