Scroll to navigation

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