2016-11-06 2 views
1

Я пытаюсь выяснить, как remove_if и vector<T>::erase работ. У меня есть код ниже (пытается удалить нечетные элементы):Стирание отдельных элементов в векторе с алгоритмом

v2.clear(); 
v2 = { 10, 20, 21, 30, 31, 33, 44, 66, 67 }; //vector<int> 
cout << "v2 is now: " << endl; 
printCollection(v2);  
cout << "Trying to remove odds from v2: " << endl; 
auto what = remove_if(begin(v2), end(v2), [](int elem) {return elem % 2 != 0;}); 
v2.erase(begin(v2), what); 
printCollection(v2); 

и вот результат:

v2 is now: 
10 20 21 30 31 33 44 66 67 

Trying to remove odds from v2: 
33 44 66 67 

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

ответ

3

Поведение вашего кода неуказано. std::remove_if перемещает все неиспользуемые элементы в переднюю часть контейнера и возвращает новый логический конечный итератор. Все элементы между этим новым концом (what в вашем коде) и .end() имеют неуказанные значения.

Вы должны стереть из what в .end() вместо:

v2.erase(what, end(v2)); 

demo

Смежные вопросы