函数模板
<algorithm>

std::replace_copy

template <class InputIterator, class OutputIterator, class T>  OutputIterator replace_copy (InputIterator first, InputIterator last,                               OutputIterator result,                               const T& old_value, const T& new_value);
复制范围并替换值
该函数将范围 [first,last) 中的元素复制到以 result 开头的范围中,将 old_value 的出现替换为 new_value

该函数使用 operator== 将各个元素与 old_value 进行比较。

范围不应重叠,以免 result 指向范围 [first,last) 中的某个元素。

此函数模板的行为等同于
1
2
3
4
5
6
7
8
9
10
template <class InputIterator, class OutputIterator, class T>
  OutputIterator replace_copy (InputIterator first, InputIterator last,
                               OutputIterator result, const T& old_value, const T& new_value)
{
  while (first!=last) {
    *result = (*first==old_value)? new_value: *first;
    ++first; ++result;
  }
  return result;
}

参数

first, last
输入迭代器 指向序列的初始位置和结束位置。复制的范围是 [first,last),它包含 firstlast 之间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
result
输出迭代器 指向存储结果序列的范围的初始位置。该范围包含的元素数量与 [first,last) 相同。
被指向的类型应支持被赋值为 T 类型的值。
old_value
要被替换的值。
new_value
替换值。

这些范围不应重叠。

返回值

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

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// replace_copy example
#include <iostream>     // std::cout
#include <algorithm>    // std::replace_copy
#include <vector>       // std::vector

int main () {
  int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };

  std::vector<int> myvector (8);
  std::replace_copy (myints, myints+8, myvector.begin(), 20, 99);

  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

输出
myvector contains: 10 99 30 30 99 10 10 99


复杂度

线性复杂度,复杂度与 firstlast 之间的距离成正比:对每个元素执行一次比较和一次赋值。

数据竞争

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

异常

如果任何元素比较、元素赋值或迭代器操作引发异常,则抛出异常。
请注意,无效参数会导致未定义行为

另见