2016-11-06 9 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

関連する問題