This is an old revision of the document!
In acest tutorial, ne propunem sa construim o structura de tip Array capabil sa se redimensioneze automat atunci cand se umple.
Ne dorim:
Vom considera ca varianta de baza o structura care contine un array de MAX_SIZE elemente, unde MAX_SIZE este initializat printr-un define.
#ifndef __RESIZABLE_ARRAY__ #define __RESIZABLE_ARRAY__ #define MAX_SIZE 100 // o dimensiune maxima prestabilita struct ResizableArray { int array[ MAX_SIZE ]; }; #endif // __RESIZABLE_ARRAY__
Pentru a putea adauga elemente si a sti cand vectorul este plin avem nevoie de capacitatea acestuia si de dimensiunea sa la un moment dat. De asemenea, ca sa il putem realoca, array-ul nu va fi initializat static!
struct ResizableArray { int *array; int capacity; int size; // Metoda de initializare void init(int capacity) { this->capacity = capacity; this->size = 0; this->array = new int[ capacity ]; } }
Metoda care adauga un element in vector ar trebui initial sa verifice daca mai este loc. In caz afirmativ, elementul se va pune pe urmatoarea pozitie libera in vector. Altfel, capacitatea vectorului se va dubla si se va actualiza la noua valoare. De asemenea, deoarece in C++ nu folosim “realloc”, vom folosi un pointer auxiliar pentru noua dimensiune pe care il vom completa cu valorile deja existente.
void push_back(int value) { // Verific daca vectorul intern este plin if (size == capacity) { // Voi face o realocare. La final copiez elementele in noul vectorl // Aloc un nou vector de dimensiune dubla. int *tmpArray = new int[ 2*capacity ]; // Copiez elementele in noul vector for ( int i = 0; i < size; ++i ) { tmpArray[ i ] = array[ i ]; } // Eliberez memoria ocupata de vechiul vector. delete[] array; // Salvez vectorul nou format, care are capacitate dubla. array = tmpArray; 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 }