2010-10-05 8 views
6

Come posso invertire il valore di ritorno di un predicato, e rimuovere gli elementi che restituiscono falso invece di vero?Passando remove_if in remove_not_if

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 y et usando C++ 0x, quindi non è permesso lambda, purtroppo. Spero che ci sia una soluzione migliore rispetto alla scrittura di un functor NotFindName.

risposta

15

Verificare not1 nell'intestazione <functional>:

headerList.remove_if(std::not1(FindName(name))); 

Oh, e questo:

if(header.Name == m_NameToFind) 
{ 
    return true; 
} 

return false; 

prega non farlo.

return (header.Name == m_NameToFind); 

Questo è molto meglio, non è vero?

+1

Grazie, funziona con le seguenti mods: Functor ha bisogno di ereditare da std :: unary_function operatore() deve essere una funzione membro const – DanDan

+1

In realtà l'eredità non è necessario, ma è necessario per definire il typedef corretto che ti dà gratuitamente. Per quanto riguarda il 'const'-ness, è ovvio :) –

0

Purtroppo credo che scrivere un funtore NotFindName è la soluzione migliore.

3

In alternativa è possibile utilizzare spinta si legano in modo da non dover scrivere che unary_function struct:

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.