Untitled
CLASSunknown
c_cpp
4 years ago
6.5 kB
6
Indexable
#include "ContenitoreDinamico.h" DinamicContainer::DinamicContainer(int firstCapacity) { //OBBLIGO CAPACITA' ALMENO 1 if (firstCapacity >= 1) { usedValues = 0; elements = new int[firstCapacity]; capacity = firstCapacity; } else do { int tmp = 0; cout << "Minimum capacity = 1" << endl << "Please insert new value = "; cin >> tmp; cout << endl; firstCapacity = tmp; usedValues = 0; elements = new int[firstCapacity]; capacity = firstCapacity; } while (firstCapacity < 1); } int DinamicContainer::getSize(DinamicContainer& firstIstance, DinamicContainer& secondIstance) { //Un getSize mi permette di fermarmi solo ai valori che effettivamente posso sommare, così faccio un doppio check riguardo l' inline operator +C if (firstIstance.getUsedValues() < secondIstance.getUsedValues()) return firstIstance.getUsedValues(); return secondIstance.getUsedValues(); } int DinamicContainer::getElements(int index) { return elements[index]; } void DinamicContainer::add(int value) { //Funzione abbastanza complicata, se gli elementi utilizzati non superano la capacità del contenitore posso inserire un valore if (usedValues < capacity) { elements[usedValues] = value; usedValues += 1; //cout << utilizzati; } else {/*Cerchiamo di ottenere una doppia traccia dei nostri valori, iniziamo con un puntatore d' appoggio, dove prendere tutti i valori precedenti del primo puntatore in modo da non perderli questo puntatore d' appoggio avrà la dimensione incrementata di 1 in modo che ogni volta che l' utente supera la capacità ma vuole reisenrire un valore, non si va in overflow, di conseguenza il nostro puntatore di partenza viene liberato e si riprende tutti i valori che si salva momentaneamente il puntatore d' appoggio*/ //Nel momento in cui i valori utilizzati sono uguali alla capacità, rischio di andare in overflow appena inserisco un valore int* v = new int[usedValues + 1]; //Puntatore con dimensione incrementata di 1 for (int i = 0; i < usedValues; i++) //Questo puntatore si salva gli elementi del vettore di partenza v[i] = elements[i]; //In questo modo i valoro iniziali inserita da utente non vanno persi v[usedValues] = value; //E ora, in testa al nostro puntatore, che é diventato un vettore, andiamo a inserire il nuovo valore inserito da utente usedValues += 1; //Aggiornamiamo la variabili utilizzati delete[] elements; //Ora liberiamo il vettore iniziale elements = new int[usedValues]; //Allochiamo al puntatore, e lo facciamo diventare un vettore nuovo con dimensione incrementata for (int i = 0; i < usedValues; i++) /*Quello che era il nostro vettore iniziale, continua ad esserlo, e si riprende i suoi valori iniziali insieme a quello nuovo che sarebbe andato in overflow*/ elements[i] = v[i]; capacity = usedValues; //Aggiorniamo la capacità del contenitore delete[] v; //Cancelliamo anche lo spazio dedicato nel nostro puntatore secondario } } int DinamicContainer::count(int value) { int counter = 0; for (int i = 0; i < usedValues; i++) { if (elements[i] == value) { counter++; } } return counter; } bool DinamicContainer::removeOne(int elem) { for (int i = 0; i < usedValues; i++) { if (elements[i] == elem) { usedValues--; elements[i] = elements[usedValues]; return true; } } return false; } int DinamicContainer::removeAll(int value) { int removed = 0; int i = 0; while (i < usedValues) { if (elements[i] == value) { usedValues--; elements[i] = elements[usedValues]; removed++; } else { i++; } } return removed; } void DinamicContainer::setDinamicSize(int value) { int* v = new int[usedValues + value]; //Puntatore con dimensione incrementata con valore da allocare for (int i = 0; i < usedValues; i++) //Questo puntatore si salva gli elementi del vettore di partenza v[i] = elements[i]; //In questo modo i valoro iniziali inserita da utente non vanno persi delete[] elements; //Ora liberiamo il vettore iniziale elements = new int[usedValues + value]; //Allochiamo al puntatore, e lo facciamo diventare un vettore nuovo con dimensione incrementata for (int i = 0; i < usedValues; i++) /*Quello che era il nostro vettore iniziale, continua ad esserlo, e si riprende i suoi valori iniziali insieme a quello nuovo che sarebbe andato in overflow*/ elements[i] = v[i]; capacity = usedValues + value; //Aggiorniamo la capacità del contenitore delete[] v; //Cancelliamo anche lo spazio dedicato nel nostro puntatore secondario } void DinamicContainer::istancesSum(DinamicContainer& firstIstance, DinamicContainer& secondIstance, DinamicContainer& thirdIstance) { int* p; //Pointer che uso per la funzione inline e calcolare la somma tra i due contenitori p = firstIstance + secondIstance; int size = firstIstance.getSize(firstIstance, secondIstance); for (int i = 0; i < size; i++) thirdIstance.add(p[i]); } void DinamicContainer::operator +=(DinamicContainer istance) { if (usedValues + istance.getUsedValues() > capacity) { setDinamicSize(usedValues + istance.getUsedValues()); } for (int i = usedValues; i < usedValues + istance.getUsedValues(); i++) { int index = i - usedValues; elements[i] = istance.getElements(index); } usedValues += istance.getUsedValues(); } void DinamicContainer::operator = (DinamicContainer istance) { if (this == &istance) { //Se passo la stessa istanza della classe come parametro , ESCO! return; } if (capacity != istance.getCapacity()) { int* v = new int[istance.getCapacity()]; delete[] elements; elements = v; capacity = istance.getCapacity(); } for (int i = 0; i < istance.getUsedValues(); i++) { elements[i - 1] = istance.getElements(i); } usedValues = istance.getUsedValues(); }
Editor is loading...