std::reverse_copy - cppreference.com (original) (raw)
- Given \(\scriptsize N\)N as std::distance(first, last). Copies the elements from the range
[first,last)(source range) to another range of \(\scriptsize N\)N elements beginning at d_first (destination range) in such a way that the elements in the destination range are in reverse order.
Behaves as if by executing the assignment *(d_first + N - 1 - i) = *(first + i)[1] once for each integer i in [0, N).
If source and destination ranges overlap, the behavior is undefined.
- Same as (1), but executed according to policy.
This overload participates in overload resolution only if all following conditions are satisfied:
Contents
- 1 Parameters
- 2 Return value
- 3 Complexity
- 4 Exceptions
- 5 Possible implementation
- 6 Notes
- 7 Example
- 8 Defect reports
- 9 See also
[edit] Parameters
| first, last | - | the pair of iterators defining the source range of elements to copy |
|---|---|---|
| d_first | - | the beginning of the destination range |
| Type requirements | ||
| -BidirIt must meet the requirements of LegacyBidirectionalIterator. | ||
| -OutputIt must meet the requirements of LegacyOutputIterator. | ||
| -ForwardIt must meet the requirements of LegacyForwardIterator. |
[edit] Return value
Output iterator to the element past the last element copied.
[edit] Complexity
Exactly \(\scriptsize N\)N assignments.
[edit] Exceptions
The overload with a template parameter named ExecutionPolicy reports errors as follows:
- If execution of a function invoked as part of the algorithm throws an exception and
ExecutionPolicyis one of the standard policies, std::terminate is called. For any otherExecutionPolicy, the behavior is implementation-defined. - If the algorithm fails to allocate memory, std::bad_alloc is thrown.
[edit] Possible implementation
See also the implementations in libstdc++, libc++, and MSVC STL.
template<class BidirIt, class OutputIt> constexpr // since C++20 OutputIt reverse_copy(BidirIt first, BidirIt last, OutputIt d_first) { for (; first != last; ++d_first) *d_first = *(--last); return d_first; }
[edit] Notes
Implementations (e.g. MSVC STL) may enable vectorization when the both iterator types satisfy LegacyContiguousIterator and have the same value type, and the value type is TriviallyCopyable.
[edit] Example
[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2074 | C++98 | for each i, the assignment was*(d_first + N - i) = *(first + i)[1] | corrected to*(d_first + N - 1 - i) = *(first + i)[1] |
| LWG 2150 | C++98 | only one element was required to be assigned | corrected the requirement |
- ↑ 1.0 1.1 1.2 LegacyOutputIterator is not required to support binary
+and-. The usages of+and-here are exposition-only: the actual computation does not need to use them.