- algorithm[meta header]
- std[meta namespace]
- function template[meta id-type]
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
}指定された範囲の要素を後ろからコピーする。
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, ","));
}- std::copy_backward[color ff0000]
- ls.begin()[link /reference/list/list/begin.md]
- std::next[link /reference/iterator/next.md]
- ls.end()[link /reference/list/list/end.md]
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;
}