名稱空間
變體
操作

std::copy_backward

來自 cppreference.com
< cpp‎ | 演算法
 
 
演算法庫
有約束演算法與針對範圍的演算法 (C++20)
有約束的演算法,例如 ranges::copyranges::sort 等……
執行策略 (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 - 目標範圍的末尾
型別要求
-
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++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 1206 C++98 1. 如果 d_last == last,則行為是良定義的
2. 如果 d_last == first,則行為是未定義的
1. 變為未定義
2. 變為良定義

[編輯] 參閱

將一個範圍的元素複製到一個新位置
(函式模板) [編輯]
以逆序複製一個範圍的元素
(演算法函式物件)[編輯]