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:
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