"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cuál es la diferencia entre `std::remove` y `std::erase` en C++?

¿Cuál es la diferencia entre `std::remove` y `std::erase` en C++?

Publicado el 2024-11-11
Navegar:182

 What\'s the Difference Between `std::remove` and `std::erase` in C  ?

Comprender la diferencia entre std::erase y std::remove

El algoritmo std::remove es una herramienta versátil diseñada para operar en cualquier par de iteradores directos, lo que lo hace aplicable a una amplia gama de contenedores y escenarios. A diferencia de su contraparte std::erase, que efectivamente elimina y elimina elementos de un contenedor, std::remove solo reorganiza elementos.

1. Descubrir los matices de std::remove

std::remove funciona dividiendo lógicamente el contenedor en dos secciones: una sección que contiene los elementos que se eliminarán y una sección que contiene los elementos restantes. Para ello, itera a través del contenedor y mueve los elementos no eliminados hacia adelante, sobrescribiendo efectivamente los elementos eliminados. Sin embargo, es importante tener en cuenta que std::remove en realidad no borra los elementos eliminados; permanecen en la memoria pero están efectivamente ocultos a la vista.

Este comportamiento se vuelve evidente cuando se usa std::remove junto con la función tamaño del contenedor(). Después de eliminar un elemento usando std::remove, std::size() continuará devolviendo el tamaño original del contenedor, aunque algunos elementos se eliminen lógicamente. El tamaño del contenedor solo cambia después de usar std::erase para eliminar físicamente los elementos ocultos.

2. Visualizando el impacto de std::remove

Considere el fragmento de código proporcionado en la pregunta original:

std::vector a;
a.push_back(1);
a.push_back(2);

std::remove(a.begin(), a.end(), 1);

int s = a.size();

Después de ejecutar std::remove, el vector todavía contiene dos elementos (2 y 2), pero el primer elemento (1) se elimina lógicamente y se oculta a la vista. Por lo tanto, std::size() devuelve 2, a pesar de la presencia de un elemento eliminado oculto.

3. Emplear std::erase para la eliminación física

Para eliminar físicamente los elementos eliminados y actualizar el tamaño del contenedor, entra en juego std::erase. Al invocar std::erase con el par de iteradores devueltos por std::remove como primer argumento, puede eliminar los elementos eliminados ocultos y reducir el tamaño del contenedor:

a.erase(std::remove(a.begin(), a.end(), 1), a.end());

En este caso, std::erase elimina físicamente el elemento 1, dejando el vector con un solo elemento (2) y un tamaño actualizado de 1.

4. Comprender el alcance de la utilidad std::remove

Si bien std::remove no está diseñado únicamente para usarse junto con std::erase, encuentra un uso extensivo en varios escenarios donde la partición lógica de Se requieren elementos. Por ejemplo, puedes emplear std::remove para:

  • Separar elementos de partición que cumplan con un criterio específico de aquellos que no.
  • Agrupar elementos similares.
  • Encontrar la posición de un elemento específico o conjunto de elementos.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3