当前位置:  开发笔记 > 编程语言 > 正文

在擦除 - 删除习语中使用UnaryPredicate的否定

如何解决《在擦除-删除习语中使用UnaryPredicate的否定》经验,为你挑选了2个好方法。

请考虑以下情形:

bool is_odd(int i)
{
    return (i % 2) != 0;  
}
int main()
{
    // ignore the method of vector initialization below.
    // assume C++11 is not to be used.
    std::vector v1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    std::vector v2 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    // removes all odd numbers, OK
    v1.erase( std::remove_if(v1.begin(), v1.end(), is_odd), v1.end() );

    // remove all even numbers
    v2.erase( std::remove_if(v2.begin(), v2.end(), ???), v2.end() );
}

我可以使用相同的is_odd()UnaryPredicate来删除最后一行中的偶数main().或者我必须写一个,is_even()即使它只会是:

bool is_even(int i)
{
    !is_odd(i);  
}

Humam Helfaw.. 10

检查std :: not1函数.它做你想要的.

v2.erase( std::remove_if(v2.begin(), v2.end(), std::not1(std::ptr_fun(is_odd))), v2.end() );

实例

无论如何,如果它取决于我加C++ 11可用我会优先:

 v2.erase( std::remove_if(v2.begin(), v2.end(), [&](auto/* or the type */ const& item){return !is_odd(item);}), v2.end() );

因为据我所知,std::not1以前lambda是有用的.



1> Humam Helfaw..:

检查std :: not1函数.它做你想要的.

v2.erase( std::remove_if(v2.begin(), v2.end(), std::not1(std::ptr_fun(is_odd))), v2.end() );

实例

无论如何,如果它取决于我加C++ 11可用我会优先:

 v2.erase( std::remove_if(v2.begin(), v2.end(), [&](auto/* or the type */ const& item){return !is_odd(item);}), v2.end() );

因为据我所知,std::not1以前lambda是有用的.



2> Dietmar Kühl..:

你可以用std::not1.遗憾的是,std::not1需要具有嵌套argument_typeresult_type类型的函数对象参数.也就是说,它不能直接使用.相反,有必要将使用与std::ptr_fun使用否定器的正常功能结合使用:

    v2.erase( std::remove_if(v2.begin(), v2.end(), std::not1(std::ptr_fun(is_odd))), v2.end() );

最后一次委员会会议std::not_fn从图书馆基础TS 2转到工作草案.也就是说,希望使用C++ 17可以更好地提供通用的否定符.

通常,当您需要使用任何std::*_fun功能时,乐趣就会停止.正如其他人所指出的那样,使用lambda可能是合理的:

v2.erase( std::remove_if(v2.begin(), v2.end(), [](auto&& x){ return !::is_odd(x); }), v2.end() );

将lambda函数或函数对象与inline函数调用操作符一起使用还具有以下优点:编译器可以更容易地内联代码.

显然,如果你需要在C++ 11之前使用C++,那么std::not1/ std::ptr_fun方法最容易立即使用,甚至不可能使用lambda函数.在这种情况下,您可能想要创建一个简单的函数对象来支持内联:

struct not_odd {
    template 
    bool operator()(T const& value) const { return !::odd(value); }
};
// ...
v2.erase( std::remove_if(v2.begin(), v2.end(), not_odd()), v2.end() );

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有