Вопрос

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

Это было полезно?

Решение

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

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

Ох, и это:

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

return false;

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

return ( header.Name == m_NameToFind );

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

Другие советы

Кроме того, вы можете использовать Boost Bind, чтобы вам не нужно написать, что 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"));

А для remove_if_not:

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

Вы можете даже использовать STD :: равный (), чтобы полностью избежать функции Header_HAS_NAME, но в этом случае она становится немного уродливым.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top