2009-03-14 19 views

Respuesta

21

prefiero remove_if

v.erase(remove_if(v.begin(), v.end(), 
       mem_fun_ref(&MyClass::isTiredOfLife)), 
     v.end()); 

remove_if devuelve un iterador que apunta después de que el último elemento que aún está en la secuencia. erase borra todo desde su primer argumento hasta el último (ambos iteradores).

+1

me había olvidado de remove_if() 1 . –

+0

Muy bueno. Nunca he visto eso antes. +1 – Bernard

+0

Gracias, eso funcionó. –

6

Usar remove_if es la forma "correcta" de hacerlo. Tenga cuidado de NO usar un iterador para recorrer y borrar, porque la eliminación de elementos invalida el iterador. De hecho, cualquier ejemplo que use borrar() como su método principal es una mala idea para los vectores, porque borrar es O (n), lo que hará que su algoritmo sea O (n^2). Esto debería ser un algoritmo O (n).

El método que proporciono a continuación es probable que sea más rápido que remove_if pero, a diferencia de remove_if, NO conservará el orden relativo de los elementos. Si le importa mantener el orden (es decir, su vector está ordenado), use remove_if, como en la respuesta anterior. Si no le importa el orden, y si el número de elementos a borrar es típicamente menos de un cuarto del vector, este método es probable que sea más rápido:

for(size_t i = 0; i < vec.size();) 
    if(vec[i].isTiredOfLife()) 
    { 
     vec[i] = vec.back(); 
     vec.pop_back(); 
    } 
    else 
     ++i; 
+0

D'oh. Me olvide de eso. Incluso está en negrita en la página que he vinculado. : o Eliminé mi publicación, para que nadie la use. – Bernard

+0

¿No reordena esto los elementos en el vector? Suponiendo que, por ejemplo, el vector de entrada se clasifique, el vector de salida no lo hará, el último elemento tomará la posición del primer elemento eliminado. –

+0

Es posible que desee actualizar su respuesta para que ya no se refiera a Bernard's. –

Cuestiones relacionadas