function template
<algorithm>

std::copy_backward

template <class BidirectionalIterator1, class BidirectionalIterator2>  BidirectionalIterator2 copy_backward (BidirectionalIterator1 first,                                        BidirectionalIterator1 last,                                        BidirectionalIterator2 result);
将序列的元素从末尾开始向后复制
将范围 [first,last) 中的元素从末尾开始复制到以 result 结尾的范围中。

该函数返回指向目标范围第一个元素的迭代器。

结果范围中的元素顺序与 [first,last) 完全相同。要反转它们的顺序,请参阅 reverse_copy

该函数首先将 *(last-1) 复制到 *(result-1),然后依次向前复制前面的元素,直到 first(包括 first)。

范围不应重叠,使得 result(即目标范围的结束之后元素)指向范围 (first,last] 中的某个元素。对于这种情况,请参阅 copy

此函数模板的行为等同于
1
2
3
4
5
6
7
8
template<class BidirectionalIterator1, class BidirectionalIterator2>
  BidirectionalIterator2 copy_backward ( BidirectionalIterator1 first,
                                         BidirectionalIterator1 last,
                                         BidirectionalIterator2 result )
{
  while (last!=first) *(--result) = *(--last);
  return result;
}

参数

first, last
双向迭代器,指向要复制的序列的初始和最终位置。使用的范围是 [first,last),它包含 firstlast 之间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
result
双向迭代器,指向目标序列的结束之后位置。
此位置不应指向范围 (first,last] 中的任何元素。

返回值

指向目标序列中第一个已复制元素的迭代器。

示例

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

int main () {
  std::vector<int> myvector;

  // set some values:
  for (int i=1; i<=5; i++)
    myvector.push_back(i*10);          // myvector: 10 20 30 40 50

  myvector.resize(myvector.size()+3);  // allocate space for 3 more elements

  std::copy_backward ( myvector.begin(), myvector.begin()+5, myvector.end() );

  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 20 30 10 20 30 40 50


复杂度

线性时间复杂度,复杂度与 firstlast 之间的 距离 成正比:对范围中的每个元素执行一次赋值操作。

数据竞争

范围 [first,last) 中的对象将被访问(每个对象恰好访问一次)。
返回的指针与 result 之间的范围中的对象将被修改(每个对象恰好被修改一次)。

异常

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

另见