Dado un vector de STL, salida sólo los duplicados en el orden establecido, por ejemplo,¿Cómo mantener solo duplicados de manera eficiente?
INPUT : { 4, 4, 1, 2, 3, 2, 3 }
OUTPUT: { 2, 3, 4 }
El algoritmo es trivial, pero el objetivo es que sea lo más eficiente como std :: única(). Mi aplicación ingenua modifica el contenedor en el lugar:
mi implementación ingenua:
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);
}
}
Si usted puede hacer esto más eficiente, elegante, o general, por favor hágamelo saber. Por ejemplo, un algoritmo de clasificación personalizado, o elementos de copia en el 2do ciclo para eliminar la llamada de borrado().
std :: unique() asume que el vector está ordenado. ¿Puede proporcionar los detalles sobre por qué cree que su código es menos eficiente? –
Solo para elegir lo que tienes: toma el contenedor por referencia. No hay ninguna razón para usar un puntero aquí (y no está seguro con 'keep_duplicates (0)', por ejemplo). Tanto el código dentro de la función como la llamada de la función se simplificarían un poco. :) – GManNickG
Para aclarar: si la entrada es '{1, 1, 1}', ¿el resultado debería ser '{1}' o '{1, 1}'? – rlbond