Editar: la documentación para std::remove
se ha corregido desde que se escribió esta respuesta. Lo mismo se aplica a list::remove
.
Déjame darte un ejemplo para mostrarte cómo cpluscplus.com puede equivocarse.
Considerar std::remove
función de <algorithm>
.
El hecho es que std::remove
no elimina el artículo del contenedor. Es porque std::remove
funciona solo con un par de iteradores y no sabe nada sobre el contenedor que realmente contiene los elementos. De hecho, no es posible std::remove
conocer el contenedor subyacente, porque no hay forma de que un par de iteradores pueda descubrir el contenedor al que pertenecen los iteradores. Entonces std::remove
, realmente no elimina los elementos, simplemente porque no puede . La única forma de eliminar realmente un elemento de un contenedor es invocar una función miembro en ese contenedor.
Entonces, si desea eliminar los elementos, use Erase-Remove Idiom :
v.erase(std::remove(v.begin(), v.end(), 10), v.end());
Pero cplusplus.com
da información incorrecta sobre std::remove
. Dice
Tenga en cuenta que esta función no altera los elementos más allá del nuevo final, que mantienen sus valores anteriores y aún son accesibles .
lo cual no es correcto El iterador en el rango [new_end, old_end)
sigue siendo desreferenciable, pero eso NO significa que conserven los valores antiguos y aún sean accesibles. No están especificados.
Del mismo modo, cplusplus.com
da información incorrecta sobre list::remove
también. Se dice ,
Observe que existe una función de algoritmo global, eliminar, con un comportamiento similar pero que opera entre dos iteradores.
lo cual está completamente mal. La eliminación global, a saber, std::remove
no es similar a list::remove
, ya que vimos que la primera NO elimina realmente los elementos del contenedor porque no puede , mientras que la segunda (la función miembro) realmente elimina los elementos porque sí puede .
Esta respuesta se copia de mi otra respuesta en el siguiente tema, con pocas modificaciones:
Nota: desde que me encontré con esto recientemente cuando respondía al tema anterior, lo recuerdo. Hay muchos errores que he encontrado en los últimos dos años, que no recuerdo. Podría agregar algunos más más tarde, si me encuentro de nuevo.