Passando remove_if in remove_not_if
-
28-09-2019 - |
Domanda
Come faccio a invertire il valore di ritorno di un predicato, e rimuovere gli elementi che il ritorno falso invece del vero?
Ecco il mio codice:
headerList.remove_if(FindName(name));
(si prega di ignorare la mancanza di erase)
con FindName un semplice funtore:
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;
}
};
vorrei qualcosa di simile:
list.remove_if(FindName(name) == false);
Non ancora utilizzando c ++ 0x, quindi lambda non ammessi, purtroppo. Spero ci sia una soluzione più bello di scrivere un funtore NotFindName.
Soluzione
not1
nell'intestazione <functional>
:
headerList.remove_if( std::not1( FindName( name ) ) );
Oh, e questo:
if(header.Name == m_NameToFind)
{
return true;
}
return false;
Si prega non farlo.
return ( header.Name == m_NameToFind );
Quello di molto meglio, non è vero?
Altri suggerimenti
In alternativa è possibile utilizzare spinta si legano in modo da non dover scrivere che struct 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"));
e per remove_if_not:
headerList.remove_if (!boost::bind (header_has_name, _1, "name"));
Si potrebbe anche usare std :: uguale () per evitare completamente la funzione header_has_name ma a quel punto diventa un po 'brutto.
Purtroppo credo che scrivere un funtore NotFindName è la soluzione migliore.