std::copy_backward() algorithm
- od C++20
- do C++20
// (1)
template< class BidirIt1, class BidirIt2 >
constexpr BidirIt2 copy_backward( BidirIt1 first, BidirIt1 last, BidirIt2 d_last );
// (1)
template< class BidirIt1, class BidirIt2 >
BidirIt2 copy_backward( BidirIt1 first, BidirIt1 last, BidirIt2 d_last );
-
(1) Copies the elements from the range, defined by [
first
;last
), to another range ending atd_last
. The elements are copied in reverse order (the last element is copied first), but their relative order is preserved.Undefined BehaviourThe behavior is undefined if
d_first
is within [first
;last
). In this case,std::copy_backward
may be used instead.
Parameters
first last | The range of elements to copy. |
d_first | The beginning of the destination range. |
Type requirements
BidirIt | LegacyBidirectionalIterator |
Return value
Iterator to the last element copied.
Complexity
Exactly last - first
assignments.
Exceptions
(none)
Possible implementation
copy_backward (1)
template<class BidirIt1, class BidirIt2>
BidirIt2 copy_backward_backward(BidirIt1 first, BidirIt1 last, BidirIt2 d_last)
{
while (first != last)
*(--d_last) = *(--last);
return d_last;
}
Notes
When copying overlapping ranges:
std::copy
is appropriate when copying to the left (beginning of the destination range is outside the source range).std::copy_backward
is appropriate when copying to the right (end of the destination range is outside the source range).
Examples
#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
Hover to see the original license.