对于通用算法,我们可以使用std::bind
来提供谓词。
我们怎么能否定这个谓词?
作为示例,请考虑一个程序,该程序在vector
中找到可分割中的第一个元素。
bool is_divisible(int m, int n)
{
return m % n == 0;
}
int main()
{
vector<int> v = { 3, 6, 9, 11, 15 };
int n = 3;
auto it = find_if(v.cbegin(), v.cend(), bind(is_divisible, _1, n));
return 0;
}
现在我想通过否定bind
提供的谓词来找到第一个不可分割的元素。我该怎么办?
我试过了
auto it = find_if(v.cbegin(), v.cend(), not1(bind(is_divisible, _1, n)));
产生以下错误
error: no type named 'argument_type' in
'struct std::_Bind<bool(*(std::_Placeholder<1>, int))(int, int)>' class unary_negate
请不要建议使用lambdas或find_if_not
,这不是此问题的目的。
非常感谢!
答案 0 :(得分:4)
由于您喜欢bind
,只需bind
一些:
find_if(v.cbegin(), v.cend(), std::bind(std::logical_not<bool>(),
std::bind(is_divisible, _1, n)));
(当然,如果你有权访问C ++ 17 not_fn
,你可以使用它。)
答案 1 :(得分:3)
你可以使用替换的:std::not_fn
(C ++ 17):
auto it = find_if(v.cbegin(), v.cend(), not_fn(bind(is_divisible, _1, n)));
答案 2 :(得分:1)
如果您有c++17能力的编译器和标准库,可以使用std::not_fn
完成:
auto it = std::find_if(v.cbegin(), v.cend(), not_fn(bind(is_divisible, _1, n)));
转发,并否定任何谓词仿函数的结果。
答案 3 :(得分:1)
试试这个
auto it = find_if(v.cbegin(), v.cend(), not1<function<bool (int)>>(bind(is_divisible, std::placeholders::_1, n)));
答案 4 :(得分:0)
您可以添加第三个参数,用于说明您是否正在寻找可分割元素:
bool is_divisible(int m, int n, bool is_divisible)
{
return is_divisible == (m % n == 0);
}