copy_if(vs2010版本)
copy_if 是我学习总结<algorithm>的第七篇,这个比较有特点,不过不能单独用,需要和vector的resize连在一起用。
copy_if的作用是有条件的复制数据。条件可以自定义,复制的对象还是把一组连续地址的数据复制到一个容器里,只不过根据条件把某些元素过滤掉了。
template <class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator copy_if (InputIterator first, InputIterator last,
OutputIterator result, UnaryPredicate pred)
{
while (first!=last) {
if (pred(*first)) {
*result = *first;
++result;
}
++first;
}
return result;
}
把数据集合里{25,15,-5,5,-15}的负数过滤掉,剩下的元素然后存在另一个容器里
test.cpp
#include <iostream> // std::cout
#include <algorithm> // std::copy_if, std::distance
#include <vector> // std::vector
#include <array>
int main ()
{
std::array<int,5> myints = {25,15,-5,5,-15};
std::vector<int> foo(5);
std::copy(myints.begin(),myints.end(),foo.begin());
std::vector<int> bar (foo.size());
// copy only positive numbers:
auto it = std::copy_if (foo.begin(), foo.end(), bar.begin(), [](int i){return !(i<0);} );
bar.resize(std::distance(bar.begin(),it)); // shrink container to new size
std::cout << "bar contains:";
std::copy(bar.begin(),bar.end(),std::ostream_iterator<int>(std::cout, " "));
std::cout << '\n';
system("pause");
return 0;
}