请考虑以下情形:
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::vectorv1 = { 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
是有用的.
检查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
是有用的.
你可以用std::not1
.遗憾的是,std::not1
需要具有嵌套argument_type
和result_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 { templatebool operator()(T const& value) const { return !::odd(value); } }; // ... v2.erase( std::remove_if(v2.begin(), v2.end(), not_odd()), v2.end() );