最終更新日時: 2026年04月13日 15時17分49秒 (JST)
teruyamato0731 が更新

履歴 編集

function template
<algorithm>

# std::move_backward(C++11)

    namespace std {
      template <class BidirectionalIterator1, class BidirectionalIterator2>
      BidirectionalIterator2
        move_backward(BidirectionalIterator1 first,
                      BidirectionalIterator1 last,
                      BidirectionalIterator2 result); // C++11

      template <class BidirectionalIterator1, class BidirectionalIterator2>
      constexpr BidirectionalIterator2
        move_backward(BidirectionalIterator1 first,
                      BidirectionalIterator1 last,
                      BidirectionalIterator2 result); // C++20
    }

## 概要

イテレータ範囲`[first, last)`の要素を出力イテレータ範囲に後ろからムーブする。

## 事前条件

- `result` はイテレータ範囲`(first,last]` に含まれてはならない

## 効果

イテレータ範囲`[first,last)` 内にある要素を、それぞれ出力イテレータ範囲`[result - (last-first),result)` へムーブする。

ムーブは `last - 1` から順番に行い、1 以上 `last - first` 以下であるそれぞれの `n` について、`*(result - n) = std::move(*(last - n))` を行う。

## 戻り値

`result - (last - first)`

## 計算量

正確に `last - first` 回ムーブ代入が行われる。

## 備考

`last` が `[result - (last-first),result)` の範囲内にあるときには、`move()` の代わりに `move_backward()` を使うべきである。

## 例

    #include <algorithm>
    #include <iostream>
    #include <vector>
    #include <memory>

    void print(const std::unique_ptr<int>& v) {
      if (v) std::cout << *v       << std::endl;
      else   std::cout << "(null)" << std::endl;
    }

    int main() {
      std::vector<std::unique_ptr<int>> v;

      for (int i = 0; i < 5; i++)
        v.emplace_back(new int(i));

      // 0,1,2 の値がある範囲を、2,3,4 の値がある範囲へムーブする
      std::move_backward(v.begin(), v.begin() + 3, v.end());

      // 以下のコードだと期待した結果にならないことを確認しよう。
      // 移動元の後方と移動先の前方でイテレータ範囲が重なっている場合は、move_backwardを使わないといけない
      // std::move(v.begin(), v.begin() + 3, v.begin() + 2);

      std::for_each(v.begin(), v.end(), &print);
    }

### 出力

    (null)
    (null)
    0
    1
    2

## 実装例

    template<class BidirectionalIterator1, class BidirectionalIterator2>
    BidirectionalIterator2 move_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
                                         BidirectionalIterator2 result) {
      while (first != last)
        *--result = move(*--last);
      return result;
    }

## バージョン

### 言語

- C++11

### 処理系

- Clang: 3.0 ✅
- GCC: 4.3.6 ✅
- ICC: ??
- Visual C++: 2010 ✅, 2012 ✅, 2013 ✅, 2015 ✅

## 関連項目

- C++11 右辺値参照・ムーブセマンティクス
- `ranges::move_backward`

## 参照

- P0202R3 Add Constexpr Modifiers to Functions in `<algorithm>` and `<utility>` Headers