GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • cpprefjp - C++日本語リファレンス
  • GitHub Project

This view

  • Original page
  • New address

GeezerVison is showing cpprefjp.github.io — std::move_backward - cpprefjp C++日本語リファレンス

  1. リファレンス
  2. algorithm
  3. move_backward

最終更新日時: 2026年09月11日 13時06分31秒 (JST)
Akira Takahashi が更新

履歴 編集

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 ✅
  • Visual C++: 2010 ✅, 2012 ✅, 2013 ✅, 2015 ✅

関連項目

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

参照

  • P0202R3 Add Constexpr Modifiers to Functions in <algorithm> and <utility> Headers
  • LWG Issue 1206. Incorrect requires for move_backward and copy_backward
    • C++11で、resultが含まれてはならない範囲が[first, last)から(first, last]に修正された。後方へコピーする場合に上書きされうるのはlastまでであり、firstは上書きされないため
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.