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

履歴 編集

function template
<algorithm>

# std::copy_backward

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

      template <class BidirectionalIterator1, class BidirectionalIterator2>
      constexpr BidirectionalIterator2
        copy_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) = *(last - n)` を行う。

## 戻り値

`result - (last - first)`

## 計算量

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

## 備考

`last` がイテレータ範囲 `[result - (last-first), result)` に含まれる場合には、`copy()` の代わりに `copy_backward()` を使うべきである。

## 例

    #include <algorithm>
    #include <iostream>
    #include <list>
    #include <iterator>

    int main() {
      std::list<int> ls = { 1,2,3,4,5 };
      // 1,2,3 の範囲を、3,4,5 の値のある範囲へコピーする
      std::copy_backward(ls.begin(), std::next(ls.begin(), 3), ls.end());

      // 以下のコードだと期待した結果にならないことを確認しよう
      // std::copy(ls.begin(), std::next(ls.begin(), 3), std::next(ls.begin(), 2));

      std::copy(ls.begin(), ls.end(), std::ostream_iterator<int>(std::cout, ","));
    }

### 出力

    1,2,1,2,3,

## 実装例

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

## バージョン

### 言語

### 処理系

- Clang: 14.0.6 ✅
- GCC: 9.5.0 ✅
- ICC: ??
- Visual C++: ??

## 関連項目

- `ranges::copy_backward`

## 参照

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