Untitled
CLASSunknown
c_cpp
4 years ago
6.5 kB
9
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...