تحويل remove_if إلى remove_not_if
-
28-09-2019 - |
سؤال
كيف يمكنني عكس قيمة إرجاع المسند ، وإزالة العناصر التي تعود خاطئة بدلاً من الصحيح؟
ها هو رمزتي:
headerList.remove_if(FindName(name));
(من فضلك تجاهل الافتقار إلى المحو)
مع FindName a 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;
}
};
أود شيء مثل:
list.remove_if(FindName(name) == false);
عدم استخدام C ++ 0x بعد ، لذلك لا يسمح Lambdas ، للأسف. آمل أن يكون هناك حل أجمل من كتابة functor 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 حتى لا تضطر إلى كتابة بنية 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"));
وللإزالة:
headerList.remove_if (!boost::bind (header_has_name, _1, "name"));
يمكنك حتى استخدام std :: equal () لتجنب وظيفة header_has_name تماما ولكن في هذه المرحلة تصبح قبيحة بعض الشيء.
لسوء الحظ ، أعتقد أن كتابة notfindname functor هو أفضل رهان لك.
لا تنتمي إلى StackOverflow