std::copy_backward
来自 cppreference.cn
定义于头文件 <algorithm> |
||
template< class BidirIt1, class BidirIt2 > BidirIt2 copy_backward( BidirIt1 first, BidirIt1 last, BidirIt2 d_last ); |
(constexpr since C++20) | |
将元素从范围 [
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) |
以相反的顺序复制元素范围 (算法函数对象) |