std:: copy_backward
|
定义于头文件
<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); // 填充为 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. 改为有明确定义 |
参见
|
(C++11)
|
将元素范围复制到新位置
(函数模板) |
|
(C++20)
|
以逆序复制元素范围
(算法函数对象) |