C++ algorithm值copy_if

函数原型:

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)

上一篇:Data Structure and Algorithm - Day 07


下一篇:Latex 算法过长 分页显示方法