This shows you the differences between two versions of the page.
sd-ca:articole:tutorial-01-1 [2016/02/24 13:08] radu.stochitoiu |
sd-ca:articole:tutorial-01-1 [2016/02/24 13:26] (current) radu.stochitoiu |
||
---|---|---|---|
Line 54: | Line 54: | ||
<code cpp> | <code cpp> | ||
void push_back(int value) { | void push_back(int value) { | ||
- | // Verific daca vectorul intern este plin | + | // Verific daca vectorul intern este plin |
- | if (size == capacity) { | + | if (size == capacity) { |
- | // Voi face o realocare. La final copiez elementele in noul vectorl | + | // Voi face o realocare. La final copiez elementele in noul vectorl |
- | // Aloc un nou vector de dimensiune dubla. | + | // Aloc un nou vector de dimensiune dubla. |
- | int *tmpArray = new int[ 2*capacity ]; | + | int *tmpArray = new int[ 2*capacity ]; |
- | // Copiez elementele in noul vector | + | // Copiez elementele in noul vector |
- | for ( int i = 0; i < size; ++i ) { | + | for ( int i = 0; i < size; ++i ) { |
- | tmpArray[ i ] = array[ i ]; | + | tmpArray[ i ] = array[ i ]; |
- | } | + | } |
- | // Eliberez memoria ocupata de vechiul vector. | + | // Eliberez memoria ocupata de vechiul vector. |
- | delete[] array; | + | delete[] array; |
- | // Salvez vectorul nou format, care are capacitate dubla. | + | // Salvez vectorul nou format, care are capacitate dubla. |
- | array = tmpArray; | + | array = tmpArray; |
- | capacity = 2 * capacity; | + | capacity = 2 * capacity; |
+ | } | ||
+ | |||
+ | // Adaug elementul la finalul vectorului | ||
+ | // Pozitia noului element este size; | ||
+ | array[ size ] = value; | ||
+ | size++; // urmatorul element adaugat va fi adaugat la o urmatoarea pozitie | ||
+ | } | ||
+ | </code> | ||
+ | ==== Adaugarea de alte elemente (e.g. sortarea) ==== | ||
+ | |||
+ | <code cpp> | ||
+ | // Metoda care sorteaza crescator elementele vectorului. | ||
+ | void sort() { | ||
+ | for ( int i = 0; i < size; ++i ) { | ||
+ | for ( int j = i + 1; j < size; ++j ) { | ||
+ | if (array[ i ] > array[ j ]) { | ||
+ | int tmp = array[i]; | ||
+ | array[ i ] = array[ j ]; | ||
+ | array[ j ] = tmp; | ||
+ | // sau std::swap(array[i], array[j]); | ||
+ | // sau array[i] ^= array[j], array[j] ^= array[i], array[i] ^= array[j]; | ||
+ | } | ||
} | } | ||
+ | } | ||
+ | } | ||
- | // Adaug elementul la finalul vectorului | + | // Metoda care afiseaza elementele vectorului. |
- | // Pozitia noului element este size; | + | void print() { |
- | array[ size ] = value; | + | std::cout << "Continut: "; |
- | size++; // urmatorul element adaugat va fi adaugat la o urmatoarea pozitie | + | for ( int i = 0; i < size; ++i ) { |
+ | std::cout << array[i] << ' '; | ||
} | } | ||
+ | std::cout << '\n'; | ||
+ | } | ||
</code> | </code> | ||
- | ==== Adaugarea de alte elemente (e.g. sortarea) ==== | ||
===== Testare si Evaluare ===== | ===== Testare si Evaluare ===== | ||
==== Program de test ==== | ==== Program de test ==== | ||
+ | |||
+ | In continuare vom face un program care prima data citeste n numere intr-un ResizableArray de dimensiune n, apoi mai citeste inca m numere pe care le introduce in acelasi ResizableArray pentru a demonstra realocarea, iar apoi va afisa elementele inainte si dupa sortarea acestora. | ||
+ | |||
+ | <code cpp> | ||
+ | #include <iostream> | ||
+ | #include "ResizableArray.h" | ||
+ | |||
+ | int main() { | ||
+ | // Declararea unui element de tip ResizableArray | ||
+ | ResizableArray ra; | ||
+ | |||
+ | // Initializarea (alocarea vectorului intern). Presupunem ca are o dimensiune n; | ||
+ | int n; | ||
+ | std::cout << "n = "; | ||
+ | std::cin >> n; | ||
+ | ra.init(n); | ||
+ | |||
+ | // Citirea si adaugarea a n elemente. | ||
+ | for ( int i = 0; i < n; ++i ) { | ||
+ | int x; // al i-lea element citit de la tastatura | ||
+ | std::cin >> x; | ||
+ | ra.push_back(x); | ||
+ | |||
+ | // Observatie: Capacitatea vectorului intern nu se modifica. | ||
+ | std::cout << "Dimensiune: " << ra.size << " Capacitate " << ra.capacity << '\n'; | ||
+ | } | ||
+ | |||
+ | // Afisare continut vector | ||
+ | ra.print(); | ||
+ | |||
+ | // Vom adauga in continuare inca m elemente; | ||
+ | int m; | ||
+ | std::cout << "m = "; | ||
+ | std::cin >> m; | ||
+ | for ( int i = 0; i < m; ++i ) { | ||
+ | int x; // al i-lea element citit de la tastatura | ||
+ | std::cin >> x; | ||
+ | ra.push_back(x); | ||
+ | |||
+ | // Observatie: Se poate modifica capacitatea vectorului intern! | ||
+ | std::cout << "Dimensiune: " << ra.size << " Capacitate " << ra.capacity << '\n'; | ||
+ | } | ||
+ | |||
+ | // Afisare continut vector | ||
+ | std::cout << "Inainte de sortare\n"; | ||
+ | ra.print(); | ||
+ | |||
+ | // Vom sorta elementele apoi vom afisa din nou continutul. | ||
+ | ra.sort(); | ||
+ | std::cout << "Dupa sortare\n"; | ||
+ | ra.print(); | ||
+ | |||
+ | // Eliberare memorie | ||
+ | delete[] ra.array; | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Exemplu: | ||
+ | |||
+ | <code bash> | ||
+ | n = 5 | ||
+ | 1 | ||
+ | Dimensiune: 1 Capacitate 5 | ||
+ | 7 | ||
+ | Dimensiune: 2 Capacitate 5 | ||
+ | 13 | ||
+ | Dimensiune: 3 Capacitate 5 | ||
+ | 2 | ||
+ | Dimensiune: 4 Capacitate 5 | ||
+ | 41 | ||
+ | Dimensiune: 5 Capacitate 5 | ||
+ | Continut: 1 7 13 2 41 | ||
+ | m = 6 | ||
+ | 1 | ||
+ | Dimensiune: 6 Capacitate 10 | ||
+ | 5 | ||
+ | Dimensiune: 7 Capacitate 10 | ||
+ | 2 | ||
+ | Dimensiune: 8 Capacitate 10 | ||
+ | -2 | ||
+ | Dimensiune: 9 Capacitate 10 | ||
+ | 1 | ||
+ | Dimensiune: 10 Capacitate 10 | ||
+ | 4 | ||
+ | Dimensiune: 11 Capacitate 20 | ||
+ | Inainte de sortare | ||
+ | Continut: 1 7 13 2 41 1 5 2 -2 1 4 | ||
+ | Dupa sortare | ||
+ | Continut: -2 1 1 1 2 2 4 5 7 13 41 | ||
+ | </code> | ||
==== Verificare cu Valgrind ==== | ==== Verificare cu Valgrind ==== | ||
+ | Pentru acelasi test rulat cu <code bash> valgrind ./main.out </code> toata memoria va fi eliberata. | ||
+ | |||
+ | <code bash> | ||
+ | ==8090== HEAP SUMMARY: | ||
+ | ==8090== in use at exit: 0 bytes in 0 blocks | ||
+ | ==8090== total heap usage: 3 allocs, 3 frees, 140 bytes allocated | ||
+ | ==8090== | ||
+ | ==8090== All heap blocks were freed -- no leaks are possible | ||
+ | ==8090== | ||
+ | ==8090== For counts of detected and suppressed errors, rerun with: -v | ||
+ | ==8090== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) | ||
+ | </code> |