Подтвердить что ты не робот

Vector:: erase (удалить (....)) не работает

Я придумал программу

#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.

Что здесь происходит?

4b9b3361

Ответ 1

std::remove принимает третий аргумент по ссылке и делает недействительными ссылки в диапазоне, в котором он работает (в том смысле, что он перемещает материал вокруг и тем самым изменяет значения элементов в диапазоне). Проблема в том, что вы меняете a[0], ссылочный аргумент, во время вызова, который вы не должны делать.

Чтобы исправить это, отправьте копию:

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

Ответ 2

В качестве альтернативы измените

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