函数原型:
template <class InputIterator, class OutputIterator, class UnaryPredicate> OutputIterator copy_if (InputIterator first, InputIterator last, OutputIterator result, UnaryPredicate pred);
功能:
拷贝范围内特定的元素
拷贝范围[first, last)中pred返回true的元素到result的开始位置。
该模板函数的功能与以下函数相等:
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; }
参数:
first,last:
输入迭代器指向序列的初始位置和结束位置。拷贝范围[first,last)包括了从first到last的所有元素,包括first迭代器指向的元素,但是不包括last迭代器指向的元素。
result:
输出迭代器指向结果序列范围的初始位置。这个范围包含的元素与[first,last)的元素一样多。
pred:
一元函数接受范围内的一个元素作为参数,并返回一个可以转换为bool的值。函数的返回值决定了该元素是否被拷贝(true拷贝元素)。该函数不应该修改他的参数。
这个参数的值可以是函数指针或者函数对象。
返回值:
一个指向结果序列最后一个元素的后一个元素的迭代器。
例子:
// copy_if example #include <iostream> // std::cout #include <algorithm> // std::copy_if, std::distance #include <vector> // std::vector int main () { std::vector<int> foo = {25,15,5,-5,-15}; 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:"; for (int& x: bar) std::cout << ' ' << x; std::cout << '\n'; return 0; }
输出:
bar contains: 25 15 5
时间复杂度:
O(n)