Si, por ejemplo, tiene un std::vector<MyClass>
, donde MyClass
tiene un método público: bool isTiredOfLife()
, ¿cómo elimina los elementos que devuelven verdadero?¿Cómo eliminarías los elementos de un std :: vector en función de alguna propiedad de los elementos?
¿Cómo eliminarías los elementos de un std :: vector en función de alguna propiedad de los elementos?
Respuesta
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).
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;
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
¿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. –
Es posible que desee actualizar su respuesta para que ya no se refiera a Bernard's. –
- 1. std :: elementos de vector inicializando
- 2. ¿Cómo imprimo los elementos de un vector C++ en GDB?
- 3. usando STL para encontrar todos los elementos de un vector
- 4. Punteros a elementos de std :: vector y std :: list
- 5. Realizar un seguimiento de los elementos eliminados usando std :: remove_if
- 6. Orden de destrucción de elementos de un std :: vector
- 7. Borrando elementos de un vector
- 8. ¿Hay alguna manera de pegar los elementos de un vector en R sin usar un bucle?
- 9. R: eliminación de los últimos elementos de un vector
- 10. Construcción predeterminada de elementos en un vector
- 11. ¿Están garantizados los elementos de un std :: map ordenados?
- 12. ¿`std :: set` ordena los elementos en todos los casos?
- 13. En clojure, cómo aplicar una función a los elementos seleccionados en un vector [gran]
- 14. Referencias de Const en std :: elementos vectoriales
- 15. Cómo obtener los primeros n elementos de un estándar :: map
- 16. Obteniendo los elementos `std :: priority_queue` en orden inverso?
- 17. múltiples elementos en un vector
- 18. ¿Cómo puedo ordenar un std :: vector por los valores de un std :: vector diferente?
- 19. ¿Cómo se seleccionan los elementos en función de su estilo?
- 20. jQuery función de disparo en todos los elementos de clase
- 21. ¿Cómo insertar elementos en un vector?
- 22. Boost.Bind para acceder a los elementos de std :: map en std :: for_each
- 23. ¿Cómo obtener los primeros n elementos (en términos de frecuencia) de un vector en R?
- 24. ¿Borrar varios objetos de un std :: vector?
- 25. Obtener todos los elementos de opciones seleccionados de todos los elementos seleccionados en un formulario
- 26. ¿Cómo trata jQuery los elementos de comentario?
- 27. suma de cuadrados de cada uno de los elementos en el vector usando for_each
- 28. ¿Cómo aplicar la función a los elementos de una lista?
- 29. Eliminar un grupo particular de elementos en un vector?
- 30. ¿Cómo crear un vector binario con 1 si los elementos son parte del mismo vector?
me había olvidado de remove_if() 1 . –
Muy bueno. Nunca he visto eso antes. +1 – Bernard
Gracias, eso funcionó. –