RevEvIf,得到相反的布尔-C++

RevEvIf,得到相反的布尔-C++,c++,vector,stl,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} 我无法让编译器接受not of bool_checker。我试过

我有密码

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}


我无法让编译器接受not of bool_checker。我试过了!bool\u checker,bool\u checker==false等等,这些都不起作用。有什么想法吗?

您可以使用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
}

看起来这是:DSince bool_checker是一个对象的扩展,否定它意味着什么?如果在传递参数时没有要求反的真/假值,但在传递参数之前必须对参数求值,则不是传递布尔值来删除\ u。@Arunas:布尔谓词的求反是返回求反结果的谓词。@MikeSeymour:wild,我没有料到它会起作用,也无法说服g++4.6.3让它起作用。例如a.eraseremove_ifa.begin、a.end、odd、a.end;将编译,但a.eraseremove_ifa.begin、a.end、!奇怪,a.结束;没有,也没有,如果开始,结束![]int x{返回x%2!=0;},a.end;尽管没有了这个,它还是会的!。就我所知,std::not1与a!不一样!。我误解了你的评论吗?@Arunas:是的,你误解了。我没说你可以用!否定谓词;只是谓词的否定的概念定义得很好。当我尝试这样做时,我得到了/usr/include/c++/4.6/bits/stl_algo.h:210:4:error:调用'std::unary_negate int&'大约6次错误。这可能与我的布尔函数是类对象有关。知道我为什么会出现这个错误吗?@Mdjon26:那是因为not1需要谓词定义一个参数类型,正如您在前面的错误中看到的那样。除非你被困在过去,否则使用lambda更方便。我尝试了v.erase的第二部分,得到了上面提到的错误。有什么想法吗?你的布卢格是什么样子的?
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
}
v.erase(remove_if(v.begin(), v.end(), std::not1(bool_checker)), v.end());