我应该实现一个从容器中删除一系列值的函数。所以
eraseRange(v, 1.5, 24);
例如将从容器 v 中删除任何大于 1.5 且小于 24 的值。我的函数非常适合列表,我在其中使用:
container.erase(remove_if(container.begin(), container.end(), rg));
其中 rg 检查它是否在范围内(那部分的实现不是问题,所以我不打算详细说明)。
但是,当为 vector 调用 eraseRange 并使用类似的方法删除值时,只会删除第一个值。所以如果我有一个数字从 1 到 10 的 vector ,我调用:
eraseRange(v, 3, 7);
只有 3 个被删除。
现在这通常不是问题,我会使用迭代器来检查值。除了这个特定的练习,for/while/do 循环被明确禁止...
所以问题似乎出在具有随机访问迭代器的容器上。而且我不确定要实现什么作为替代方案。帮忙?
最佳答案
erase
有几个重载。
您正在使用的重载采用单个迭代器并删除迭代器指向的元素。
您应该使用的另一个重载接受一个范围(一对迭代器)并删除该范围内的所有元素:
c.erase(remove_if(c.begin(), c.end(), rg), c.end());
^^^^^^^^^
[我不确定为什么您的代码“非常适合列表”,如您所说; std::list
具有相同的两个 erase
重载。请注意,std::list
还有一个成员函数,remove_if
,它提供了一个更好的删除/删除算法实现,专门针对 std::list< 进行了优化
(由于 std::list
是作为链表实现的,它可以在不实际移动任何对象的情况下实现删除/删除)。]
关于C++ vector ; remove_if 只删除一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7730077/