Volviendo remove_if en remove_not_if
-
28-09-2019 - |
Pregunta
¿Cómo puedo revertir valor de retorno de un predicado, y retirar los elementos que el retorno falsa en lugar de verdad?
Aquí está mi código:
headerList.remove_if(FindName(name));
(por favor, ignora la falta de borrado)
FindName con un funtor simple:
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;
}
};
Me gustaría algo como:
list.remove_if(FindName(name) == false);
Todavía no usando C ++ 0x, por lo lambdas no permitido, por desgracia. Estoy esperando que hay una solución mejor que escribir un funtor NotFindName.
Solución
not1
en la cabecera <functional>
:
headerList.remove_if( std::not1( FindName( name ) ) );
Ah, y esto:
if(header.Name == m_NameToFind)
{
return true;
}
return false;
Por favor, no haga eso.
return ( header.Name == m_NameToFind );
Eso de más mejor, ¿verdad?
Otros consejos
Si lo prefiere puede utilizar impulso se unen por lo que no tiene que escribir esa estructura 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"));
y para remove_if_not:
headerList.remove_if (!boost::bind (header_has_name, _1, "name"));
Incluso podría usar std :: igual () para evitar la función header_has_name por completo, pero en ese momento se convierte en un poco feo.
Desafortunadamente, creo que escribir un funtor NotFindName es la mejor opción.