函数模板
<algorithm>

std::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 开头的范围。

此函数模板的行为等同于
1
2
3
4
5
6
7
8
9
10
11
12
13
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),它包含 firstlast 之间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
InputIterator 应指向一个可以 赋值OutputIterator 指向的元素类型。
result
输出迭代器,指向存储结果序列的范围的起始位置。该范围包含与 [first,last) 一样多的元素。
pred
一元函数,接受范围中的元素作为参数,并返回一个可转换为 bool 的值。返回值表示该元素是否应被复制(如果为 true,则复制)。
该函数不得修改其任何参数。
这可以是函数指针,也可以是函数对象。

这些范围不应重叠。

返回值

一个指向结果序列中最后一个写入元素的下一个元素的迭代器。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 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


复杂度

线性于 firstlast 之间的 距离:将 pred 应用于范围中的每个元素,并执行最多与该距离等量的赋值操作。

数据竞争

访问范围 [first,last) 中的对象。
修改 result 和返回的迭代器之间的范围内的对象。

异常

如果 pred、元素赋值或迭代器操作抛出异常,则此函数也抛出异常。
请注意,无效参数会导致未定义行为

另见