Mise en remove_if remove_not_if
-
28-09-2019 - |
Question
Comment puis-je inverser la valeur de retour d'un prédicat, et supprimer les éléments faux retour au lieu de vrai?
Voici mon code:
headerList.remove_if(FindName(name));
(s'il vous plaît ignorer le manque d'effacement)
avec un FindName de foncteur 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;
}
};
Je voudrais quelque chose comme:
list.remove_if(FindName(name) == false);
Pas encore en C ++ 0x, donc lambdas pas permis, malheureusement. J'espère qu'il ya une solution plus agréable que d'écrire un foncteur NotFindName.
La solution
Vérifier not1
dans l'en-tête <functional>
:
headerList.remove_if( std::not1( FindName( name ) ) );
Oh, et ceci:
if(header.Name == m_NameToFind)
{
return true;
}
return false;
S'il vous plaît ne pas le faire.
return ( header.Name == m_NameToFind );
beaucoup mieux, non?
Autres conseils
Sinon, vous pouvez utiliser bind boost afin que vous n'avez pas à écrire que 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"));
et remove_if_not:
headerList.remove_if (!boost::bind (header_has_name, _1, "name"));
Vous pouvez même utiliser std :: égale () pour éviter la fonction header_has_name complètement, mais à ce moment-là, il devient un peu laid.
Malheureusement, je pense que la rédaction d'un foncteur NotFindName est votre meilleur pari.