Y a-t-il une raison spécifique pour ne pas avoir l'algorithme std::copy_if en C++ ? Je sais que je peux utiliser std::remove_copy_if pour obtenir le comportement requis. Je pense que c'est prévu dans C++0x, mais un simple copy_if qui prend une plage, un itérateur de sortie et un foncteur aurait été bien. Est-ce que cela a été simplement omis ou y a-t-il une autre raison derrière cela ?
Réponses
Trop de publicités?
rlbond
Points
24215
Nikos Athanasiou
Points
7015
Pour être complet, au cas où quelqu'un trouverait la réponse à cette question sur Google, il convient de mentionner que maintenant (après C++11) il y a a copie si algorithme. Il se comporte comme prévu (il copie les éléments d'une plage, pour laquelle un prédicat renvoie vrai, vers une autre plage).
Un cas d'utilisation typique serait
std::vector<int> foo{ 25, 15, 5, -5, -15 };
std::vector<int> bar;
// copy only positive numbers:
auto it = std::copy_if (foo.begin(), foo.end(), std::back_inserter(bar),
[](int i){return !(i<0);
});
alex tingle
Points
3134
C'est très facile d'écrire le sien :
template <class InputIterator, class OutputIterator, class Predicate>
OutputIterator copy_if(InputIterator first, InputIterator last,
OutputIterator result, Predicate pred)
{
return std::remove_copy_if(first,last,result,std::not1(pred));
}
Edit : Cette version fonctionne avec tous les prédicats :
template <class InputIterator, class OutputIterator, class Predicate>
OutputIterator copy_if(InputIterator first, InputIterator last,
OutputIterator result, Predicate pred)
{
while(first!=last)
{
if(pred(*first))
*result++ = *first;
++first;
}
return result;
}