c++ - vector.erase() 和 remove_if() 有问题

标签 c++ vector erase-remove-idiom

在使用 remove_if 之前,我使用的是 remove。假设我有 vec = {1, 2, 2, 2, 5},并且想删除所有 2,我会这样做:

for (vector<int>::iterator it = vec.begin(); it!= vector.end(); ++it){
    if (*it == 2){
       vec.erase(remove(vec.begin(),vec.end(), *it), vec.end());
    }
}

这是行不通的,因为在删除过程中遍历 vector 是不可能的,也是不合逻辑的。

然后我发现了 remove_if()。但是,出于某种原因,我无法让它在类的上下文中工作。这是我的代码:

class SomeClass{
    private:
       vector<int> vec;
    public:
       SomeClass(){
           //initalizae vec to {1,2,2,2,4,5,6,8}
       }
       bool is_even(int value){
           return value % 2 == 0;
       }
       void delete(int a){
           vec.erase(remove_if(vec.begin(), vec.end(), a), vec.end());
       }
       void delete_even(int a){
           vec.erase(remove_if(vec.begin(), vec.end(), this->is_even(a)), vec.end());
       }

我猜 void delete 将不起作用,因为 a 是一个 int,我需要一个 bool 值,但不确定如何将“如果 int a 在此 vector 中,则返回 true”表示为 remove_if 的第三个参数。我希望 void delete_even 可以工作,但我得到了

note: in instantiation of function template specialization 'std::__1::remove_if<std::__1::__wrap_iter<int *>, bool>' requested here

最佳答案

只需使用 std::remove 从集合中删除一个 int 值,无需自己搜索:

vec.erase(std::remove(vec.begin(), vec.end(), 2), vec.end());

这将从 vec 中删除所有出现的 2

remove_if 的用法是一样的,只是那时你给一个谓词(通常是一个函数)而不是一个元素;如果您可以使用 C++11,您可以像这样将它与 lambda 一起使用:

vec.erase(std::remove_if(vec.begin(), vec.end(), [](int a) {return a % 2 == 0;}), vec.end());

如果你想使用 is_even 作为 remove_if 的谓词(或你的类的另一个成员函数),那么正如评论中提到的,你应该将它设为最好是静态成员函数。 您还可以绑定(bind) 到非静态成员,但这里没有真正的理由这样做;但见Using std::bind with member function, use object pointer or not for this argument?如果你很好奇,问题本身包含正确的语法。 is_even 为静态的示例:

 static bool is_even(int value) {
     return value % 2 == 0;
 }

 void delete_even(int a){
     vec.erase(remove_if(vec.begin(), vec.end(), is_even), vec.end());
 }

关于c++ - vector.erase() 和 remove_if() 有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33571609/

相关文章:

c++ - boost::intrusive_ptr 改变指针地址

c++ - 仅提供部分特化的方法

c++ - 我们可以在 C++ 中打印类对象的地址吗?

c++ - 为 vector 类编写 sort() 方法

c++ - 在 C++ 中返回字符串和不同 vector 数据类型的映射

c++ - 使用 Ranges-V3 移除标记为移除的元素

c++ - #import 是 C++11 标准的一部分吗?

c++ - std::map 与自写的基于 std::vector 的字典

c++ - 使用 erase-remove_if 习语

c++ - 为什么 std::erase 和 std::erase_if 不支持投影?