最終更新日時(UTC):
が更新

履歴 編集

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;
}

参照