remove index delete c++ vector erase

c++ - index - vector:: erase(remove(...)) no funciona



vector pop c++ (2)

Alternativamente, cambiar

a.erase(remove(a.begin(), a.end(), 1), a.end()); b.erase(remove(b.begin(), b.end(), 6), b.end());

Se me ocurrió un programa

#include <vector> #include <algorithm> using namespace std; int main() { vector<int> a = {1,2,3,7,1,5,4}; vector<int> b = {6,7,4,3,3,1,7}; a.erase(remove(a.begin(),a.end(),a[0]),a.end()); b.erase(remove(b.begin(),b.end(),b[0]),b.end()); return 1; }

Para este ejemplo específico, mi GNU gdb Ubuntu establece que en la línea return 1 : a = {2,3,7,1,5,4} que no se espera (solo borra uno 1 ), b = {7,4,3,3,1} que no se espera.

Mi expectativa es b debe ser a=2,3,7,5,4 b=7,4,3,3,1,7 .

¿Que está pasando aqui?


std::remove toma el tercer argumento por referencia e invalida las referencias en el rango en el que trabaja (en el sentido de que cambia las cosas y por lo tanto cambia los valores de los elementos en el rango). El problema es que cambia a[0] , el argumento de referencia, durante la llamada, lo cual no debe hacer.

Para solucionar esto, pase una copia en su lugar:

a.erase(remove(a.begin(),a.end(),int{a[0]}),a.end());