std::reverse_copy(3) | C++ Standard Libary | std::reverse_copy(3) |
NAME¶
std::reverse_copy - std::reverse_copy
Synopsis¶
Defined in header <algorithm>
template< class BidirIt, class OutputIt >
OutputIt reverse_copy( BidirIt first, BidirIt last, (1) (constexpr
since C++20)
OutputIt d_first );
template< class ExecutionPolicy, class BidirIt, class
ForwardIt >
ForwardIt reverse_copy( ExecutionPolicy&& policy, (2)
(since C++17)
BidirIt first, BidirIt last,
ForwardIt d_first );
1) 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.
2) Same as (1), but executed according to policy.
This overload participates in overload resolution only if
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> is
true. (until
C++20)
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>
is true. (since
C++20)
Parameters¶
first, last - the 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.
Return value¶
Output iterator to the element past the last element copied.
Complexity¶
Exactly \(\scriptsize N\)N assignments.
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 ExecutionPolicy is one of the standard policies, std::terminate is
called.
For any other ExecutionPolicy, the behavior is implementation-defined.
* If the algorithm fails to allocate memory, std::bad_alloc is thrown.
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;
}
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.
Example¶
// Run this code
#include <algorithm>
#include <iostream>
#include <vector>
int main()
{
auto print = [](const std::vector<int>& v)
{
for (const auto& value : v)
std::cout << value << ' ';
std::cout << '\n';
};
std::vector<int> v{1, 2, 3};
print(v);
std::vector<int> destination(3);
std::reverse_copy(std::begin(v), std::end(v), std::begin(destination));
print(destination);
std::reverse_copy(std::rbegin(v), std::rend(v), std::begin(destination));
print(destination);
}
Output:¶
1 2 3
3 2 1
1 2 3
Defect reports
The following behavior-changing defect reports were applied retroactively to
previously published C++ standards.
DR Applied to Behavior as published Correct behavior
for each i, the assignment was corrected to
LWG 2074 C++98 *(d_first + N - i) = *(first + i)^[1] *(d_first + N - 1 - i) =
*(first + i)^[1]
LWG 2150 C++98 only one element was required to be corrected the requirement
assigned
1. ↑ ^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.
See also¶
reverse reverses the order of elements in a range
(function template)
ranges::reverse_copy creates a copy of a range that is reversed
(C++20) (niebloid)
2024.06.10 | http://cppreference.com |