c++ - microsoft - visual studio installer
La combinación std:: erase y std:: remove para eliminar un elemento específico no funciona para un ejemplo específico (1)
#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 7.7.1 indica que en la línea de retorno 1: a = {2,3,7,1,5,4} que no se espera (solo borra 1), y b = {7 , 4,3,3,1} que no se espera.
Mi expectativa es que b debería ser a = 2,3,7,5,4 yb = 7,4,3,3,1,7.
¿Que esta pasando aqui?
La declaración de std::remove()
parece a
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
Tenga en cuenta que el último parámetro es una referencia. Así, después de la compilación, efectivamente pasa la dirección del elemento especificado.
Mediante remove(a.begin(), a.end(), a[0])
, algo que indica la dirección al elemento 0 de a
se pasa. Cuando se ejecuta remove()
, una vez que se maneja el elemento 0th, el El valor señalado por la referencia pasada cambia, lo que conduce al resultado inesperado.
Para obtener el resultado esperado, haga una copia antes de llamar a std::remove()
.
int toberemoved = a[0];
a.erase(remove(a.begin(),a.end(),toberemoved),a.end());