2010-10-05 14 views
6

¿Cómo puedo invertir el valor de retorno de un predicado y eliminar los elementos que devuelven falso en lugar de verdadero?Convertir remove_if en remove_not_if

Aquí está mi código:

headerList.remove_if(FindName(name)); 

(por favor, ignora la falta de borrado)

con FindName 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 así como:

list.remove_if(FindName(name) == false); 

Not y et utilizando C++ 0x, por lo que lambdas no está permitido, por desgracia. Espero que haya una solución más agradable que escribir un functor NotFindName.

Respuesta

15

Comprobar 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 lo hacen.

return (header.Name == m_NameToFind); 

Eso es mucho mejor, ¿verdad?

+1

Gracias, funciona con las siguientes modificaciones: Functor necesita para heredar de std :: unary_function operador() tiene que haber un método constante – DanDan

+1

En realidad herencia no es necesario, pero es necesario para definir el typedef apropiado que te da de forma gratuita. En cuanto a la 'const'-dad, es evidente :) –

0

Desafortunadamente, creo que escribir un functor NotFindName es su mejor opción.

3

otra posibilidad es utilizar impulso se unen por lo que no tiene que escribir que unary_function estructura:

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 puede utilizar std :: igual() para evitar la función header_has_name por completo, pero en ese punto se vuelve un poco feo.