Namespaces
Variants

std::copy_backward

ja.cppreference.net より
 
 
アルゴリズムライブラリ
制約付きアルゴリズムと範囲アルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy, ranges::sort, ...
ソートおよび関連操作
分割操作
(C++11)    

ソート操作
二分探索操作
(分割された範囲に対する)
集合操作 (ソート済み範囲に対する)
マージ操作 (ソート済み範囲に対する)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書順比較操作
順列操作


 
ヘッダ <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)&要素の範囲を新しい位置にコピーする
要素の範囲を逆順にコピーする
(アルゴリズム関数オブジェクト)