This is an old revision of the document!


Tutorial 1.1 - ResizableArray

In acest tutorial, ne propunem sa construim o structura de tip Array capabil sa se redimensioneze automat atunci cand se umple.

Obiective

Ne dorim:

  • să construim struct ResizableArray, cu un membru astfel încât să poată reține un vector de elemente de tip int, cu o dimensiune initiala specificata printr-un define
  • să adaugam lui struct ResizableArray o metodă de adăugare a unui element nou. Dacă vectorul intern este deja plin, se va aloca un nou vector de dimensiune dublă, se va copia conținutul original și se va adăuga apoi noul element ca în mod obișnuit
  • să adaugam si alte functionalitati lui struct ResizableArray, precum sortarea elementelor
  • să testam struct ResizableArray printr-un cod simplu care arată cum se adaugă elemente și cum se redimensionează structura de date
  • să verificam cu Valgrind că nu sunt memory leaks.

Dezvoltare

Varianta de baza a lui struct ResizableArray

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__

Adaugarea de elemente si redimensionare

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
	}

Adaugarea de alte elemente (e.g. sortarea)

Testare si Evaluare

Program de test

Verificare cu Valgrind

sd-ca/articole/tutorial-01-1.1456312121.txt.gz · Last modified: 2016/02/24 13:08 by radu.stochitoiu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0