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++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 1206 | C++98 | 1. 如果 d_last == last,則行為是良定義的 2. 如果 d_last == first,則行為是未定義的 |
1. 變為未定義 2. 變為良定義 |
[編輯] 參閱
(C++11) |
將一個範圍的元素複製到一個新位置 (函式模板) |
(C++20) |
以逆序複製一個範圍的元素 (演算法函式物件) |