6

How can I reverse a predicate's return value, and remove the elements that return false instead of true?

Here is my code:

headerList.remove_if(FindName(name));

(please ignore lack of erase)

with FindName a simple functor:

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;
    }
};

I would like something like:

list.remove_if(FindName(name) == false);

Not yet using c++0x, so lambdas not allowed, sadly. I'm hoping there is a nicer solution than writing a NotFindName functor.

DanDan
  • 10,462
  • 8
  • 53
  • 69

3 Answers3

15

Check not1 in the <functional> header:

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

Oh, and this:

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

return false;

Please don't do that.

return ( header.Name == m_NameToFind );

That's much better, isn't it?

DevSolar
  • 67,862
  • 21
  • 134
  • 209
  • 1
    Thanks, it works with the following mods: Functor needs to inherit from std::unary_function operator() needs to be a const member function – DanDan Oct 05 '10 at 14:42
  • 1
    Actually inheritance is not necessary, but you need to define the proper typedef that it gives you for free. As for the `const`-ness, it goes without saying :) – Matthieu M. Oct 05 '10 at 18:48
3

alternatively you could use boost bind so you don't have to write that unary_function struct:

bool header_has_name (const CHeader& h, const CString& n) {return h.name == n;}

headerList.remove_if (boost::bind (header_has_name, _1, "name"));

and for remove_if_not:

headerList.remove_if (!boost::bind (header_has_name, _1, "name"));

You could even use std::equal() to avoid the header_has_name function completely but at that point it becomes a little bit ugly.

denis
  • 500
  • 4
  • 5
0

Unfortunately I think writing a NotFindName functor is your best bet.

Timo Geusch
  • 24,095
  • 5
  • 52
  • 70