当前位置:  开发笔记 > 编程语言 > 正文

如何在std :: remove_if之后使用"removed"元素

如何解决《如何在std::remove_if之后使用"removed"元素》经验,为你挑选了1个好方法。

说我们有:

struct IsEven {
   bool operator() (int i) { return i % 2 == 0; }
};

然后:

vector V; // fill with ints
vector::iterator new_end = remove_if(V.begin(), V.end(), IsEven());
V.erase(new_end, V.end());

工作得很好(它只留下V奇数整数).但似乎从元素new_endV.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



1> Michael Burr..:

听起来你想用它partition()来将矢量分成开头的奇数值组和结尾的偶数值. partition()将迭代器返回到第二个分组的第一个元素.

至于WTF,我不确定为什么你会期望一个删除操作来保存你想要删除的元素,方法是将它们(这是额外的工作)复制到容器的末尾.大多数人认为WTF remove()(以及它的表兄弟)是这样的事实:向量的大小没有减少,你必须调用erase()实际删除不需要的元素后删除操作.

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有