std::copy_backward
来自 zh.cppreference.net
| 定义于头文件 <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. 变为良好定义 |
参阅
(C++11) |
将一个范围中的元素复制到新位置 (函数模板 & 算法函数对象) |
(C++20)(C++20) |
|
(C++20) |
以逆序复制一个范围中的元素 (算法函数对象) |