std::copy_backward
From cppreference.com
| ヘッダー <algorithm> で定義 |
||
| template< class BidirIt1, class BidirIt2 > BidirIt2 copy_backward( BidirIt1 first, BidirIt1 last, BidirIt2 d_last ); |
(C++20 以降 constexpr) | |
範囲 [first, last) の要素を、d_last で終わる別の範囲にコピーします。要素は逆順(最後の要素が最初にコピーされる)にコピーされますが、相対的な順序は保持されます。
d_last が (first, last] の範囲内にある場合、未定義の動作となります。std::copy は、そのような場合に std::copy_backward の代わりに使用する必要があります。
目次 |
[編集] パラメータ
| first, last | - | コピー元の 範囲 を定義するイテレータのペア |
| d_last | - | コピー先の範囲の終端 |
| 型要件 | ||
-BidirIt は LegacyBidirectionalIterator の要件を満たしている必要があります。 | ||
[編集] 戻り値
コピーされた最後の要素を指すイテレータ。
[編集] 計算量
std::distance(first, last) 回の代入。
[編集] 注記
重複する範囲をコピーする場合、コピー先範囲の開始位置がコピー元範囲の外側にある(左へのコピー)場合は std::copy が適切であり、コピー先範囲の終了位置がコピー元範囲の外側にある(右へのコピー)場合は std::copy_backward が適切です。
[編集] 可能な実装
template<class BidirIt1, class BidirIt2> BidirIt2 copy_backward(BidirIt1 first, BidirIt1 last, BidirIt2 d_last) { while (first != last) *(--d_last) = *(--last); return d_last; } |
[編集] 例
このコードを実行
#include <algorithm> #include <iostream> #include <numeric> #include <vector> int main() { std::vector<int> source(4); std::iota(source.begin(), source.end(), 1); // fills with 1, 2, 3, 4 std::vector<int> destination(6); std::copy_backward(source.begin(), source.end(), destination.end()); std::cout << "destination contains: "; for (auto i: destination) std::cout << i << ' '; std::cout << '\n'; }
出力
destination contains: 0 0 1 2 3 4
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 1206 | C++98 | 1. d_last == last の場合、動作は定義されていました。 2. d_last == first の場合、動作は未定義でした。 |
1. 未定義に変更されました。 2. 定義されるようになりました。 |
[編集] 関連項目
| (C++11) |
要素の範囲を新しい場所にコピーする (関数テンプレート) |
| (C++20) |
要素の範囲を逆順にコピーする (アルゴリズム関数オブジェクト) |