# std::move_backward

< cpp‎ | algorithm

定义于头文件 `<algorithm>` |  |
template< class BidirIt1, class BidirIt2 > BidirIt2 move_backward( BidirIt1 first, BidirIt1 last, BidirIt2 d_last ); |  | (C++11 起) (C++20 前)
template< class BidirIt1, class BidirIt2 > constexpr BidirIt2 move_backward( BidirIt1 first, BidirIt1 last, BidirIt2 d_last ); |  | (C++20 起)

移动来自范围 `[first, last)` 的元素到终于 `d_last` 的另一范围。以逆序移动元素（首先复制末元素），但保持其相对顺序。

若 `d_last` 在 `(first, last]` 内则行为未定义。该情况下必须用 `std::move` 代替 `std::move_backward` 。

### 参数

first, last | - | 要移动的元素范围
d_last | - | 目标范围结尾
类型要求
- `BidirIt1, BidirIt2` 必须满足老式双向迭代器 (LegacyBidirectionalIterator) 的要求。

### 返回值

目标范围中的迭代器，指向最后移动的元素。

### 复杂度

准确移动赋值 `last - first` 次。

### 可能的实现

    template< class BidirIt1, class BidirIt2 >
    BidirIt2 move_backward(BidirIt1 first,
                                         BidirIt1 last,
                                         BidirIt2 d_last)
    {
        while (first != last) {
            *(--d_last) = std::move(*(--last));
        }
        return d_last;
    }

### 注解

移动重叠的范围时， std::move 适合向左移动（目标范围的起始在源范围外）时，而 `std::move_backward` 适合向右移动（目标范围的结尾在源范围外）时。

### 示例

    #include <algorithm>
    #include <vector>
    #include <string>
    #include <iostream>

    int main()
    {
        std::vector<std::string> src{"foo", "bar", "baz"};
        std::vector<std::string> dest(src.size());

        std::cout << "src: ";
        for (const auto &s : src)
        {
            std::cout << s << ' ';
        }
        std::cout << "\ndest: ";
        for (const auto &s : dest)
        {
            std::cout << s << ' ';
        }
        std::cout << '\n';

        std::move_backward(src.begin(), src.end(), dest.end());

        std::cout << "src: ";
        for (const auto &s : src)
        {
            std::cout << s << ' ';
        }
        std::cout << "\ndest: ";
        for (const auto &s : dest)
        {
            std::cout << s << ' ';
        }
        std::cout << '\n';
    }

输出：

    src: foo bar baz
    dest:
    src:
    dest: foo bar baz

### 参阅

move (C++11) | 将某一范围的元素移动到一个新的位置 (函数模板)
ranges::move_backword (C++20) | 按从后往前的顺序移动某一范围的元素到新的位置 (niebloid)