2016-11-06 67 views
1

我想弄清楚如何使用remove_ifvector<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