std::copy_backward
来自 cppreference.com
定义在头文件 <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) |
以反向顺序复制一系列元素 (niebloid) |