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

标签 c++ stl erase remove-if

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

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/

相关文章:

c++ - i =++i 等的未定义行为规则

c++ - VS2010 中令人困惑的 std::string::c_str() 行为

c++ - 如何在 map 中存储指针

c++ - 在 vector<int> 中定义的索引处从 vector<string> 中删除一个字符串

c++ - 如何在 C++ 的循环中从 vector 中删除元素

c++ - 从 vector 中删除元素 – rbegin() 与 begin()

c++ - FreeRTOS+STM32F4+CPP调用vTaskDelay时卡住

c++ - CUDD:访问 BDD child

c++ - 如何使子窗口位于最上面?

c++ - 字符串分词器失败