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());