我有代码
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
等等,但这些都没有奏效。有什么想法吗?
答案 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());