Untitled
unknown
c_cpp
4 years ago
7.0 kB
7
Indexable
//OVVIAMENTE NON UTILIZZEREMO PIU' LE NEW INT MA LE NEW T, SICCOME USIAMO IL CONTENITORE TEMPLATE template <class T> DinamicContainer<T>::DinamicContainer(int firstCapacity) { //OBBLIGO CAPACITA' ALMENO 1 if (firstCapacity >= 1) { usedValues = 0; elements = new T[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 T[firstCapacity]; capacity = firstCapacity; } while (firstCapacity < 1); } template <class T> int DinamicContainer<T>::getUsedValues() { return this->usedValues; } template <class T> int DinamicContainer<T>::getCapacity() { return this->capacity; } template <class T> int DinamicContainer<T>::getSize(DinamicContainer<T>& firstIstance, DinamicContainer<T>& secondIstance) { //Un getSize mi permette di fermarmi solo ai valori che effettivamente posso sommare, così faccio un doppio check riguardo l' inline operator + if (firstIstance.getUsedValues() < secondIstance.getUsedValues()) return firstIstance.getUsedValues(); return secondIstance.getUsedValues(); } template <class T> T DinamicContainer<T>::getElements(int index) { return elements[index]; } template <class T> void DinamicContainer<T>::add(T 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 T* v = new T[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 T[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 } } template <class T> int DinamicContainer<T>::count(T value) { int counter = 0; for (int i = 0; i < usedValues; i++) { if (elements[i] == value) { counter++; } } return counter; } template <class T> bool DinamicContainer<T>::removeOne(T elem) { for (int i = 0; i < usedValues; i++) { if (elements[i] == elem) { usedValues--; elements[i] = elements[usedValues]; return true; } } return false; } template <class T> int DinamicContainer<T>::removeAll(T value) { int removed = 0; int i = 0; while (i < usedValues) { if (elements[i] == value) { usedValues--; elements[i] = elements[usedValues]; removed++; } else { i++; } } return removed; } template <class T> void DinamicContainer<T>::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 } template <class T> void DinamicContainer<T>::istancesSum(DinamicContainer<T>& firstIstance, DinamicContainer<T>& secondIstance, DinamicContainer<T>& thirdIstance) { T* 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]); } template <class T> void DinamicContainer<T>::operator +=(DinamicContainer<T> 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(); } template <class T> void DinamicContainer<T>::operator = (DinamicContainer<T> istance) { if (this == &istance) { //Se passo la stessa istanza della classe come parametro , ESCO! return; } if (capacity != istance.getCapacity()) { T* v = new T[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...