首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将remove_if转换为remove_not_if

将remove_if转换为remove_not_if
EN

Stack Overflow用户
提问于 2010-10-05 22:27:26
回答 3查看 3.1K关注 0票数 6

如何反转谓词的返回值,并删除返回false而不是true的元素?

下面是我的代码:

代码语言:javascript
复制
headerList.remove_if(FindName(name));

(请忽略缺少擦除)

使用FindName作为一个简单的函数器:

代码语言:javascript
复制
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;
    }
};

我想要这样的东西:

代码语言:javascript
复制
list.remove_if(FindName(name) == false);

还没有使用c++0x,所以不幸的是lambda是不被允许的。我希望有比编写NotFindName函数器更好的解决方案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-05 22:31:13

检查<functional>报头中的not1

代码语言:javascript
复制
headerList.remove_if( std::not1( FindName( name ) ) );

哦,还有这个:

代码语言:javascript
复制
if(header.Name == m_NameToFind)
{
    return true;
}

return false;

请不要那样做。

代码语言:javascript
复制
return ( header.Name == m_NameToFind );

这样好多了,不是吗?

票数 15
EN

Stack Overflow用户

发布于 2010-10-05 23:42:08

或者,您可以使用boost绑定,这样就不必编写unary_function结构:

代码语言:javascript
复制
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:

代码语言:javascript
复制
headerList.remove_if (!boost::bind (header_has_name, _1, "name"));

您甚至可以使用std::equal()来完全避免header_has_name函数,但在这一点上,它变得有点丑陋。

票数 3
EN

Stack Overflow用户

发布于 2010-10-05 22:29:23

不幸的是,我认为编写一个NotFindName函数器是最好的选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3864627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档