了解copy_if的正确实现
先看copy和copy_if的使用小demo:
vector<int> from(10);
std::iota(from.begin(), from.end(), 0); //0 - 9
vector<int> to;
//copy
std::copy(from.begin(), from.end(),
back_inserter(to));
std::copy(to.begin(), to.end(),
std::ostream_iterator<int>(std::cout, " "));
vector<int> to_;
//copy_if
std::copy_if(from.begin(), from.end(), back_inserter(to_), [=](const int value)
{
return value > 5;
});
std::copy(to_.begin(), to_.end(),
std::ostream_iterator<int>(std::cout, " "));
打印如下,0-9是to的容器你内容,6-9是to_的容器内容:
copy和copy_if的实现如下:
template<class InputIt, class OutputIt>
OutputIt copy(InputIt first, InputIt last,
OutputIt d_first)
{
while (first != last) {
*d_first++ = *first++;
}
return d_first;
}
template<class InputIt, class OutputIt, class UnaryPredicate>
OutputIt copy_if(InputIt first, InputIt last,
OutputIt d_first, UnaryPredicate pred)
{
while (first != last) {
if (pred(*first))
*d_first++ = *first;
first++;
}
return d_first;
}