我应该实现一个从容器中删除一系列值的函数。所以
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循环被明确禁止...
所以问题似乎是具有随机访问迭代器的容器。而且我不确定如何实施替代方案。帮助
答案 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)