std:: copy_backward
|
定義先ヘッダ
<algorithm>
|
||
|
template
<
class
BidirIt1,
class
BidirIt2
>
BidirIt2 copy_backward ( BidirIt1 first, BidirIt1 last, BidirIt2 d_last ) ; |
(constexpr since C++20) | |
範囲
[
first
,
last
)
の要素を
d_last
で終わる別の範囲にコピーします。要素は逆順に(最後の要素が最初にコピーされます)コピーされますが、相対的な順序は保持されます。
d_last
が
(
first
,
last
]
の範囲内にある場合、動作は未定義です。
その場合は
std::copy_backward
の代わりに
std::copy
を使用する必要があります。
目次 |
パラメータ
| 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; } |
`タグ内のC++コードは翻訳せず、そのまま保持しています。C++の専門用語(`template`、`BidirIt1`、`copy_backward`など)も翻訳対象外としました。
例
#include <algorithm> #include <iostream> #include <numeric> #include <vector> int main() { std::vector<int> source(4); std::iota(source.begin(), source.end(), 1); // 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)
|
要素の範囲を逆順にコピーする
(アルゴリズム関数オブジェクト) |