Поверните Remove_if в Remove_not_If
-
28-09-2019 - |
Вопрос
Как я могу отменить возвратную величину предиката и удалить элементы, которые возвращают 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 - это ваша лучшая ставка.