说我们有:
struct IsEven { bool operator() (int i) { return i % 2 == 0; } };
然后:
vectorV; // fill with ints vector ::iterator new_end = remove_if(V.begin(), V.end(), IsEven()); V.erase(new_end, V.end());
工作得很好(它只留下V
奇数整数).但似乎从元素new_end
到V.end()
是不是我们正在删除偶数.例如,如果v
以as开头1 4 2 8 5 7
,那么我就会得到8 5 7
这些元素(尽管在erase
调用之后,向量确实已经1 5 7
离开了).
显然,(根据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.
首先,WTF?第二,如何在没有实质重新实现的情况下解决这个问题remove_if
?
听起来你想用它partition()
来将矢量分成开头的奇数值组和结尾的偶数值. partition()
将迭代器返回到第二个分组的第一个元素.
至于WTF,我不确定为什么你会期望一个删除操作来保存你想要删除的元素,方法是将它们(这是额外的工作)复制到容器的末尾.大多数人认为WTF remove()
(以及它的表兄弟)是这样的事实:向量的大小没有减少,你必须调用erase()
实际删除不需要的元素后删除操作.