Namespaces
Variants

std::copy_backward

来自 zh.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
则行为是良好定义的2. 如果 d_last == first
则行为是未定义的1. 变为未定义
2. 变为良好定义

参阅

将一个范围中的元素复制到新位置
(函数模板 & 算法函数对象)
以逆序复制一个范围中的元素
(算法函数对象)