Превращение remove_if в remove_not_if - PullRequest
6 голосов
/ 05 октября 2010

Как я могу отменить возвращаемое значение предиката и удалить элементы, которые возвращают ложь вместо истины?

Вот мой код:

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, поэтому лямбды не разрешены, к сожалению,Я надеюсь, что есть более приятное решение, чем написание функтора NotFindName.

Ответы [ 3 ]

15 голосов
/ 05 октября 2010

Проверьте not1 в заголовке <functional>:

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

О, и это:

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

return false;

Пожалуйста не делай этого.

return ( header.Name == m_NameToFind );

Это намного лучше, не так ли?

3 голосов
/ 05 октября 2010

в качестве альтернативы вы можете использовать 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, но в этот момент она становится немного уродливой.

0 голосов
/ 05 октября 2010

К сожалению, я думаю, что написание функтора NotFindName - ваш лучший выбор.

...