名前空間
変種
操作

std::copy_backward

From cppreference.com
< cpp‎ | algorithm
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとRangeアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy, ranges::sort, ...
実行ポリシー (C++17)
シーケンスを変更しない操作
一括操作
(C++17)
検索操作
(C++11)                (C++11)(C++11)

シーケンスを変更する操作
コピー操作
copy_backward
(C++11)
(C++11)
スワップ操作
変換操作
生成操作
削除操作
順序変更操作
(C++17まで)(C++11)
(C++20)(C++20)
サンプリング操作
(C++17)

ソートおよび関連操作
パーティション操作
ソート操作
二分探索操作
(パーティション化された範囲)
集合操作 (ソート済み範囲)
マージ操作 (ソート済み範囲)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書順比較操作
順列操作
Cライブラリ
数値演算
未初期化メモリに対する操作
 
ヘッダー <algorithm> で定義
template< class BidirIt1, class BidirIt2 >
BidirIt2 copy_backward( BidirIt1 first, BidirIt1 last, BidirIt2 d_last );
(C++20 以降 constexpr)

範囲 [firstlast) の要素を、d_last で終わる別の範囲にコピーします。要素は逆順(最後の要素が最初にコピーされる)にコピーされますが、相対的な順序は保持されます。

d_last(firstlast] の範囲内にある場合、未定義の動作となります。std::copy は、そのような場合に std::copy_backward の代わりに使用する必要があります。

目次

[編集] パラメータ

first, last - コピー元の 範囲 を定義するイテレータのペア
d_last - コピー先の範囲の終端
型要件
-
BidirItLegacyBidirectionalIterator の要件を満たしている必要があります。

[編集] 戻り値

コピーされた最後の要素を指すイテレータ。

[編集] 計算量

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. 定義されるようになりました。

[編集] 関連項目

要素の範囲を新しい場所にコピーする
(関数テンプレート) [編集]
要素の範囲を逆順にコピーする
(アルゴリズム関数オブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)