6

如何反转谓词的返回值,并删除返回 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,所以遗憾的是不允许使用 lambda。我希望有一个比编写 NotFindName 函子更好的解决方案。

4

3 回答 3

15

检查not1标题<functional>

headerList.remove_if( std::not1( FindName( name ) ) );

哦,还有这个:

if(header.Name == m_NameToFind)
{
    return true;
}

return false;

不要那样做。

return ( header.Name == m_NameToFind );

好多了,不是吗?

于 2010-10-05T14:31:12.747 回答
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 函数,但此时它变得有点难看。

于 2010-10-05T15:42:07.590 回答
0

不幸的是,我认为编写 NotFindName 函子是您最好的选择。

于 2010-10-05T14:29:22.540 回答