Dato un vettore STL, uscita solo i duplicati in modo ordinato, per esempio,Come mantenere solo i duplicati in modo efficiente?
INPUT : { 4, 4, 1, 2, 3, 2, 3 }
OUTPUT: { 2, 3, 4 }
L'algoritmo è banale, ma l'obiettivo è quello di rendere il più efficiente std :: unico(). La mia implementazione ingenuo modifica il contenitore sul posto:
mia ingenua implementazione:
void not_unique(vector<int>* pv)
{
if (!pv)
return;
// Sort (in-place) so we can find duplicates in linear time
sort(pv->begin(), pv->end());
vector<int>::iterator it_start = pv->begin();
while (it_start != pv->end())
{
size_t nKeep = 0;
// Find the next different element
vector<int>::iterator it_stop = it_start + 1;
while (it_stop != pv->end() && *it_start == *it_stop)
{
nKeep = 1; // This gets set redundantly
++it_stop;
}
// If the element is a duplicate, keep only the first one (nKeep=1).
// Otherwise, the element is not duplicated so erase it (nKeep=0).
it_start = pv->erase(it_start + nKeep, it_stop);
}
}
Se si può fare questo più efficiente, elegante, o generale, per favore fatemelo sapere. Ad esempio, un algoritmo di ordinamento personalizzato o copia elementi nel secondo ciclo per eliminare la chiamata cancella().
std :: unique() presuppone che il vettore sia ordinato. Puoi fornire le specifiche sul motivo per cui pensi che il tuo codice sia meno efficiente? –
Solo per scegliere quello che hai: prendi il contenitore come riferimento. Non c'è motivo di usare un puntatore qui (e non si è sicuri con 'keep_duplicates (0)', per esempio.) Sia il codice all'interno della funzione che il richiamo della funzione sarebbero semplificati un po '. :) – GManNickG
Per chiarire: se l'input è '{1, 1, 1}', l'output dovrebbe essere '{1}' o '{1, 1}'? – rlbond