Una soluzione in
)
per eliminare i duplicati da un piccolo array è una scelta un tantino troppo radicale al giorno d'oggi...
In un contesto non constrained, il problema si risolve banalmente in tempo lineare. E' necessario e sufficiente fare uso di un array di appoggio, sia pure di dimensione fissa e allocato sullo stack anziché nello heap.
Ecco una possibile soluzione quick'n'dirty:
codice:
void killDupes(vettore v, int &n)
{
vettore tmp;
int vsize = n;
int last = tmp[0] = v[0];
for (int j = 1, n = 1; j < vsize; ++j)
{
if (last != v[j])
{
tmp[n++] = v[j];
last = v[j];
}
}
memcpy(v, tmp, --n * sizeof(int));
}
Vale inoltre la pena di rilevare che tutto il codice proposto nel presente thread si presenta come C++, ma in realtà fa uso di idiomi e strutture dati tipiche del C per i vettori.
Per motivi piuttosto complessi,
qui chiariti in modo sufficientemente approfondito alla luce degli opportuni riferimenti, in C++ gli array del C sono deprecati e dovrebbero cedere il posto alle strutture specializzate (vere e proprie classi OOP) come
vector o
valarray.
Nulla di male in questo caso, poiché i basilari array C hanno una enorme validità didattica intrinseca nella loro primitiva modellazione della memoria fisica del PC, ma è opportuno esserne consapevoli.
