Fau*_*ult 1 c++ stl erase remove-if
我应该实现一个从容器中删除一系列值的函数.所以
eraseRange(v, 1.5, 24);
Run Code Online (Sandbox Code Playgroud)
例如,从容器v中删除大于1.5且小于24的任何值.并且我的函数适用于列表,我在其中使用:
container.erase(remove_if(container.begin(), container.end(), rg));
Run Code Online (Sandbox Code Playgroud)
rg检查它是否在范围内(该部分的实现不是问题,所以我不打算详细说明).
但是,当为向量调用eraseRange并使用类似的方法擦除值时,只有第一个值被擦除.所以,如果我有一个数字从1到10的向量,我打电话给:
eraseRange(v, 3, 7);
Run Code Online (Sandbox Code Playgroud)
只有3个被删除.
现在这通常不会成为问题,我只想使用迭代器来检查值.除了这个特定的练习,明确禁止/ while/do循环...
所以问题似乎是具有随机访问迭代器的容器.而且我不确定如何实施替代方案.救命?
Jam*_*lis 10
有几个重载erase.
一个重载,即您正在使用的重载,需要一个迭代器并擦除迭代器指向的元素.
您应该使用的另一个重载需要一个范围(一对迭代器)并擦除该范围内的所有元素:
c.erase(remove_if(c.begin(), c.end(), rg), c.end());
^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
[正如你所说,我不确定为什么你的代码"适用于列表"; std::list具有相同的两个重载erase.注意,std::list还有一个成员函数,remove_if它提供了一个更好的执行特别优化的擦除/删除算法std::list(因为std::list它实现为链表,它可以实现擦除/删除而不实际移动任何对象).