Saltar al contenido

Eliminar por índice de un vector C++ usando remove_if

Esta es la solución más válida que te podemos aportar, pero mírala pausadamente y analiza si se puede adaptar a tu proyecto.

Puede usar la aritmética de punteros para encontrar el índice de un elemento específico que std::remove_if pasa al predicado:

std::remove_if(data.begin(), data.end(),
               [&data](const double& d)  return (&d - &*data.begin()) % 2); );

Tenga en cuenta que remove_if pasa el resultado de desreferenciar un iterador, y se garantiza que será un reference según la Tabla 106 – Requerimientos de iterador en el Estándar.

De hecho, me hice una cuenta solo para esto. Usa la respuesta Awesomeyi. Es mucho más limpio.

int count = 0;
auto final = std::remove_if (data.begin(), data.end(), [&count](const double d) 
    return (count++) % 2;
);

El estándar dice que el predicado se aplica exactamente por última vez, por primera vez. Y remove_if funciona con ForwardIterators.

Esto implica que el predicado se aplica solo una vez en el mismo orden en que aparecen originalmente en la secuencia.

A menos, por supuesto, que la biblioteca lo esté engañando al mantener copias internas de ForwardIterator.

Recuerda algo, que puedes optar por la opción de interpretar si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *