2016-11-06 4 views
1

J'essaie de comprendre comment fonctionne remove_if et vector<T>::erase. J'ai le code ci-dessous (en essayant de supprimer des éléments impairs):Effacement d'éléments particuliers dans un vecteur avec algorithme

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); 

et est ici la sortie:

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

Trying to remove odds from v2: 
33 44 66 67 

Que se passe-t-il?

Répondre

3

Le comportement de votre code n'est pas spécifié. std::remove_if déplace tous les éléments non supprimés vers l'avant du conteneur et renvoie le nouvel itérateur de fin logique. Tous les éléments entre cette nouvelle extrémité (what dans votre code) et .end() ont des valeurs non spécifiées.

Vous devez effacer de what à la place .end():

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

demo