如何反转谓词的返回值,并删除返回false而不是true的元素?
这是我的代码:
headerList.remove_if(FindName(name));
(请忽略缺少擦除)
使用FindName一个简单的仿函数:
struct FindName
{
CString m_NameToFind;
FindInspectionNames(const CString &nameToFind)
{
m_NameToFind = nameToFind;
}
bool operator()(const CHeader &header)
{
if(header.Name == m_NameToFind)
{
return true;
}
return false;
}
};
我想要像:
list.remove_if(FindName(name) == false);
还没有使用c ++ 0x,所以不允许使用lambdas。我希望有一个比编写NotFindName仿函数更好的解决方案。
答案 0 :(得分:15)
检查<functional>
标题中的not1
:
headerList.remove_if( std::not1( FindName( name ) ) );
哦,这个:
if(header.Name == m_NameToFind)
{
return true;
}
return false;
请不要这样做。
return ( header.Name == m_NameToFind );
那是很多更好,不是吗?
答案 1 :(得分:3)
或者您可以使用boost bind,因此您不必编写该unary_function结构:
bool header_has_name (const CHeader& h, const CString& n) {return h.name == n;}
headerList.remove_if (boost::bind (header_has_name, _1, "name"));
和remove_if_not:
headerList.remove_if (!boost::bind (header_has_name, _1, "name"));
您甚至可以使用std :: equal()来完全避免header_has_name函数,但此时它会变得有点难看。
答案 2 :(得分:0)
不幸的是,我认为编写NotFindName仿函数是最好的选择。