"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 > ¿Por qué erase-remove_if deja pares duplicados al eliminar elementos de un `std::vector`?

¿Por qué erase-remove_if deja pares duplicados al eliminar elementos de un `std::vector`?

Publicado el 2024-12-23
Navegar:732

Why does erase-remove_if leave behind duplicate pairs when removing elements from a `std::vector`?

Erase-Remove_if Modismo para eliminar pares

Al intentar emplear el modismo erase-remove_if para eliminar pares de un std::vector>, surge un problema peculiar. A pesar de apuntar a pares con un valor .first de 4 para su eliminación, la implementación inicial deja un par duplicado:

stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [&](const stopPointPair stopPoint)-> bool { return stopPoint.first == 4; }));

La raíz del problema radica en el proceso de borrado incompleto. std::erase_if solo desplaza los elementos coincidentes al final del vector; no los elimina. Para completar la eliminación, el enfoque correcto es utilizar el iterador devuelto por std::remove_if como punto de partida para el borrado:

stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [](const stopPointPair stopPoint)-> bool 
                                       { return stopPoint.first == 4; }), 
                 stopPoints.end());

Comprensión del mecanismo Erase-Remove_if:

  • Intercambio de elementos: std::remove_if intercambia elementos dentro del vector, empujando todos los elementos no coincidentes hacia el principio. Los elementos coincidentes terminan en la parte trasera del vector.
  • Iteración de predicado: La expresión lambda de predicado determina qué elementos eliminar. Si el predicado devuelve verdadero, el elemento correspondiente se mueve al final del vector.
  • Recuperación de iterador: std::remove_if devuelve un iterador que apunta al primer elemento que coincide con el predicado; este iterador marca el inicio de los elementos que se eliminarán.
  • Vector Erasure: std::vector::erase invoca la operación de borrado de rango, comenzando desde el iterador devuelto y extendiéndose hasta el vector. fin. Este paso elimina todos los elementos coincidentes del vector.

Para obtener más información, consulte el artículo de Wikipedia sobre [Erase-Remove Idiom](https://en.wikipedia.org/ wiki/Erase-remove_idiom).

Ú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