dire que nous avons:Comment utiliser les "enlevés" éléments après std :: remove_if
struct IsEven {
bool operator() (int i) { return i % 2 == 0; }
};
Puis:
vector<int> V; // fill with ints
vector<int>::iterator new_end = remove_if(V.begin(), V.end(), IsEven());
V.erase(new_end, V.end());
fonctionne très bien (il laisse V
avec seulement les entiers impairs) . Mais il semble que les éléments de new_end
à V.end()
sont pas les entiers pairs que nous supprimons. Par exemple, si v
commence comme 1 4 2 8 5 7
, alors je reçois 8 5 7
pour ces éléments (bien qu'après l'appel erase
, le vecteur a effectivement 1 5 7
à gauche).
Apparemment, (selon http://www.sgi.com/tech/stl/remove_if.html)
The iterators in the range [new_last, last) are all still dereferenceable,
but the elements that they point to are unspecified.
Tout d'abord, WTF? Et deuxièmement, comment puis-je contourner cela sans essentiellement réimplémenter remove_if
?
Un conseil connexe dans le cas où vous utilisez un conteneur de pointeurs - utilisez la partition si vous voulez supprimer en utilisant les pointeurs: http://www.ddj.com/architect/184401414 –