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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top