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++: ??