2008-11-28 8 views

Répondre

6

La manière idiomatique de le faire est comme jalf l'a dit. Vous pouvez construire votre propre fonction pour faire plus facilement:

template<typename T, typename Pred> void erase_if(T &vec, Pred pred) 
{ 
    vec.erase(std::remove_if(vec.begin(), vec.end(), pred), vec.end()); 
} 

Vous pouvez donc utiliser

std::vector<int> myVec; 
// (...) fill the vector. (...) 
erase_if(myVec, myPred); 
+0

Très soigné. C'est évident quand on le voit mais je n'y aurais pas pensé moi-même. Je pense que je pourrais m'en tenir à la méthode de Jalf, car vous pouvez voir ce qui est utilisé mais je suis probablement juste une mauviette ... – Patrick

-2

Je ne sais pas. Peut-être qu'il y a. Mais s'il y en a, alors ce sera une sacrée déclaration. Personne ne sera capable de le comprendre ou de le maintenir. Si ces deux lignes font ce que vous voulez, restez avec elles. Ils sont parfaitement bien.

+0

suggestion de Jaff est idiomatiques. Et le programmeur professionnel C++ devrait le comprendre instantanément. –

5

Vous voulez dire comme ça?

vec.erase(std::remove_if(vec.begin(), vec.end(), pred), vec.end()); 

C'est la manière idiomatique de le faire.

+0

Il s'agit toujours d'un algorithme plus un appel de fonction membre, pas un seul appel d'algorithme. Je ne considérerais pas cela comme une amélioration par rapport à la suggestion initiale. – Ralph

+0

True. Le titre du thread demande une seule * instruction *, et cette version répond à cette exigence. Mais oui, il n'y a pas de fonction unique intégrée qui a l'effet désiré, mais il est facile de composer soi-même, comme le montre la réponse de ckarmann. – jalf

Questions connexes