remove_if,得到相反的布尔 C++

remove_if, getting the opposite bool c++

本文关键字:布尔 C++ if remove      更新时间:2023-10-16

我有代码

vector <int> v;
v.erase(remove_if(v.begin(),v.end(),bool_checker),v.end());

其中v是保存随机数{2, 4 ,5, 6, 7, 11}的向量,bool_checker是评估数字是否为素数的类对象

我想删除不是质数的数字。换句话说,我希望v看起来像{5, 7, 11}。现在v.erase()正在抹去的不是质数。所以输出是{2, 4, 6}.

我无法让编译器接受bool_checker的不。我试过(!bool_checker)bool_checker==false等,但这些都没有奏效。有什么想法吗?

v.erase(remove_if(v.begin(),v.end(),std::not1(bool_checker)),v.end());

您可以使用 lambda 返回返回值的否定:

v.erase(std::remove_if(v.begin(), v.end(), [] (int x) {
    return !bool_checker(x);
}), v.end());

首先,2 是一个质数。

其次,没有看到bool_checker的内容,听起来你的逻辑在里面是倒退的。 简单版本(效率不高(可能如下所示:

bool bool_checker(int i)
{
    int root = (int)sqrt(i);
    for (int j = 2; j <= root; ++j)
    {
        if (i % j == 0)
        {
            return false; // number is not prime
        }
    }
    return true; // number is prime
}

如果您不能或不想更改bool_checker函子,则可以否定它:

v.erase(remove_if(v.begin(), v.end(), std::not1(bool_checker)), v.end());