Drehen remove_if in remove_not_if
-
28-09-2019 - |
Frage
Wie kann ich ein Prädikat des Reverse-Rückgabewert, und entfernen Sie die Elemente, die return false statt wahr?
Hier ist mein Code:
headerList.remove_if(FindName(name));
(bitte Mangel an Lösch ignorieren)
mit Findname ein einfaches Funktors:
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;
}
};
Ich möchte so etwas wie:
list.remove_if(FindName(name) == false);
Noch nicht mit C ++ 0x, Lambda-Ausdrücke so nicht erlaubt, traurig. Ich hoffe, es gibt eine schönere Lösung als eine NotFindName Funktors schreiben.
Lösung
Überprüfen Sie not1
im <functional>
Header:
headerList.remove_if( std::not1( FindName( name ) ) );
Oh, und diese:
if(header.Name == m_NameToFind)
{
return true;
}
return false;
Bitte tun das nicht.
return ( header.Name == m_NameToFind );
Das ist viel besser, ist es nicht?
Andere Tipps
Alternativ können Sie boost binden verwenden, so dass Sie nicht, dass unary_function struct schreiben müssen:
bool header_has_name (const CHeader& h, const CString& n) {return h.name == n;}
headerList.remove_if (boost::bind (header_has_name, _1, "name"));
und für remove_if_not:
headerList.remove_if (!boost::bind (header_has_name, _1, "name"));
Sie könnten sogar std :: gleich (), um die header_has_name Funktion vollständig zu vermeiden, aber an diesem Punkt wird es ein bisschen hässlich.
Leider glaube ich eine NotFindName Funktors schreibt, ist die beste Wahl.