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.

Что тут происходит?


person Madhu Kumar Dadi    schedule 02.07.2015    source источник


Ответы (2)


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

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

a.erase(remove(a.begin(),a.end(),int{a[0]}),a.end());
person Baum mit Augen    schedule 02.07.2015

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

a.erase(remove(a.begin(), a.end(), 1), a.end());
b.erase(remove(b.begin(), b.end(), 6), b.end());
person Shreevardhan    schedule 02.07.2015