remove_if,获得相反的bool c ++

时间:2013-10-01 15:59:20

标签: c++ vector stl

我有代码

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的not。我已经尝试了(!bool_checker)bool_checker==false等等,但这些都没有奏效。有什么想法吗?

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

首先,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());