function template
<algorithm>

std::move_backward

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

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

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

该函数首先将 *(last-1) 移动到 *(result-1),然后向后移动这些元素,直到到达 first(包括 first)。

范围不应以 result(目标范围中的结束之后元素)指向 (first,last] 范围内的元素的方式重叠。对于这种情况,请参阅 move

此函数模板的行为等同于
1
2
3
4
5
6
7
8
template<class BidirectionalIterator1, class BidirectionalIterator2>
  BidirectionalIterator2 move_backward ( BidirectionalIterator1 first,
                                         BidirectionalIterator1 last,
                                         BidirectionalIterator2 result )
{
  while (last!=first) *(--result) = std::move(*(--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
// move_backward example
#include <iostream>     // std::cout
#include <algorithm>    // std::move_backward
#include <string>       // std::string

int main () {
  std::string elems[10] = {"air","water","fire","earth"};

  // insert new element at the beginning:
  std::move_backward (elems,elems+4,elems+5);
  elems[0]="ether";

  std::cout << "elems contains:";
  for (int i=0; i<10; ++i)
    std::cout << " [" << elems[i] << "]";
  std::cout << '\n';

  return 0;
}

输出
elems contains: [ether] [air] [water] [fire] [earth] [] [] [] [] []


复杂度

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

数据竞争

两个范围内的对象都会被修改。

异常

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

另见