Constrained algorithms and algorithms on ranges(C++20) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Constrained algorithms, e.g.ranges::copy,ranges::sort, ... | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Execution policies(C++17) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Numeric operations | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Operations on uninitialized memory | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Defined in header <algorithm> | ||
template<class BidirIt1,class BidirIt2> BidirIt2 copy_backward( BidirIt1 first, BidirIt1 last, BidirIt2 d_last); | (constexpr since C++20) | |
Copies the elements from the range[
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.
The behavior is undefined ifd_last is within(
first,
last]
.std::copy must be used instead ofstd::copy_backward
in that case.
Contents |
first, last | - | the pair of iterators defining the sourcerange of elements to copy from |
d_last | - | the end of the destination range |
Type requirements | ||
-BidirIt must meet the requirements ofLegacyBidirectionalIterator. |
Iterator to the last element copied.
Exactlystd::distance(first, last) assignments.
When copying overlapping ranges,std::copy is appropriate when copying to the left (beginning of the destination range is outside the source range) whilestd::copy_backward
is appropriate when copying to the right (end of the destination range is outside the source range).
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';}
Output:
destination contains: 0 0 1 2 3 4
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 1206 | C++98 | 1. the behavior was well-defined ifd_last== last 2. the behavior was undefined ifd_last== first | 1. made undefined 2. made well-defined |
(C++11) | copies a range of elements to a new location (function template)[edit] |
(C++20) | copies a range of elements in backwards order (algorithm function object)[edit] |