std::copy_backward
ja.cppreference.net より
| ヘッダ <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の場合の動作は明確に定義されていた d_last == first
|
2. の場合の動作は未定義だった |
1. 未定義に変更
| copy_if (C++11)&要素の範囲を新しい位置にコピーする | |
(C++20)(C++20) |
|
(C++20) |
要素の範囲を逆順にコピーする (アルゴリズム関数オブジェクト) |