c ++ vector; remove_if只删除一个值?

时间:2011-10-11 17:33:53

标签: c++ stl erase remove-if

我应该实现一个从容器中删除一系列值的函数。所以

eraseRange(v, 1.5, 24);
例如,

将从容器v中删除任何大于1.5且小于24的值。并且我的函数适用于列表,我在其中使用:

container.erase(remove_if(container.begin(), container.end(), rg));

rg检查它是否在范围内(该部分的实现不是问题,所以我不打算详细说明)。

但是,当为向量调用eraseRange并使用类似方法擦除值时,只会擦除第一个值。所以,如果我有一个数字从1到10的向量,我打电话给:

eraseRange(v, 3, 7);

只有3个被删除。

现在这通常不会成为问题,我只想使用迭代器来检查值。除了这个特定的练习,for / while / do循环被明确禁止...

所以问题似乎是具有随机访问迭代器的容器。而且我不确定如何实施替代方案。帮助

2 个答案:

答案 0 :(得分:10)

erase有几次重载。

一个重载,即你正在使用的重载,需要一个迭代器并擦除迭代器指向的元素。

您应该使用的另一个重载需要一个范围(一对迭代器)并擦除该范围内的所有元素:

c.erase(remove_if(c.begin(), c.end(), rg), c.end());
                                         ^^^^^^^^^

[我不确定为什么你的代码“适用于列表”,如你所说; std::list具有相同的两个erase重载。请注意,std::list还有一个成员函数remove_if,它提供了针对std::list专门优化的擦除/移除算法的更好实现(因为std::list实现为链接列表,它可以实现擦除/删除而不实际移动任何对象。)]

答案 1 :(得分:1)

remove_if将单个迭代器返回到“new last”。这就是它改变了所有令你满意的谓词的东西。新的句号之前的所有内容都不能满足你的谓词,而一切都过去了。由于您仅对向量中的单个项目执行erase,因此您只删除新的最后一个 - 这只是满足您的谓词的一件事。相反,你想要删除最后的所有内容 - >结束这是满足你的谓词的一切

container.erase(
   remove_if(container.begin(), container.end(), rg), 
   container.end()
 );