vector::erase(remove(....)) не работает
Я придумал программу
#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;
}
В этом конкретном примере мой GNU GDB Ubuntu утверждает, что в return 1
линия: a = {2,3,7,1,5,4}
который не ожидается (удаляет только один 1
), а также b = {7,4,3,3,1}
чего не ожидается.
Мое ожидание a
а также b
должно быть a=2,3,7,5,4
а также b=7,4,3,3,1,7
,
Что тут происходит?
2 ответа
Решение
std::remove
принимает третий аргумент по ссылке, и он делает недействительными ссылки в диапазоне, в котором он работает (в том смысле, что он перемещает вещи вокруг и, таким образом, изменяет значения элементов в диапазоне). Проблема в том, что вы меняете a[0]
ссылочный аргумент во время вызова, который вы не должны делать.
Чтобы это исправить, передайте копию вместо:
a.erase(remove(a.begin(),a.end(),int{a[0]}),a.end());
В качестве альтернативы, изменить
a.erase(remove(a.begin(), a.end(), 1), a.end());
b.erase(remove(b.begin(), b.end(), 6), b.end());