std::copy_backward
来自 cppreference.cn
定义于头文件 <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++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
---|---|---|---|
LWG 1206 | C++98 | 1. 如果 d_last == last,则行为是良定义的 2. 如果 d_last == first,则行为是未定义的 |
1. 变为未定义 2. 变为良定义 |
[编辑] 参阅
(C++11) |
将一个范围的元素复制到一个新位置 (函数模板) |
(C++20) |
以逆序复制一个范围的元素 (算法函数对象) |