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());
Другие вопросы по тегам