Namespaces
Variants

std:: copy_backward

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
copy_backward
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
定義先ヘッダ <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;
}
**注記**: 指定された要件に従い、HTMLタグ、属性、および`
`タグ内の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. 定義済みに変更

関連項目

要素の範囲を新しい位置にコピーする
(関数テンプレート)
要素の範囲を逆順にコピーする
(アルゴリズム関数オブジェクト)