std::reverse_copy
Определено в заголовке <algorithm> |
||
|---|---|---|
| (1) | ||
template< class BidirIt, class OutputIt > OutputIt reverse_copy( BidirIt first, BidirIt last, OutputIt d_first ); |
(до C++20) | |
template< class BidirIt, class OutputIt >
constexpr OutputIt reverse_copy( BidirIt first, BidirIt last,
OutputIt d_first );
|
(с C++20) | |
template< class ExecutionPolicy, class BidirIt, class ForwardIt >
ForwardIt reverse_copy( ExecutionPolicy&& policy,
BidirIt first, BidirIt last, ForwardIt d_first );
|
(2) | (с C++17) |
std::distance(first, last). Копирует элементы из диапазона [first, last) в другой диапазон из \(\scriptsize N\)N элементов, начинающийся в d_first (диапазон назначения), таким образом, что элементы в диапазоне назначения расположены в обратном порядке.*(d_first + N - 1 - i) = *(first + i)[1] осуществлялось один раз для каждого целого i в [0, N).[first, last) и диапазон назначения перекрываются, поведение не определено.policy. Этот перегрузка не участвует в разрешении перегрузки, если |
| (до C++20) |
|
| (с C++20) |
Параметры
| first, last | - | диапазон копируемых элементов |
| d_first | - | начало целевого диапазона |
| Требования к типу | ||
-BidirIt должен соответствовать требованиям LegacyBidirectionalIterator. |
||
-OutputIt должен соответствовать требованиям LegacyOutputIterator. |
||
-ForwardIt должен соответствовать требованиям LegacyForwardIterator. |
||
Возвращаемое значение
Итератор на элемент, следующий за последним скопированным элементом.
Сложность
Ровно \(\scriptsize N\)N присваиваний.
Исключения
Перегрузка с параметром шаблона, названным ExecutionPolicy, сообщает об ошибках следующим образом:
- Если выполнение функции, вызванной как часть алгоритма, вызывает исключение, и
ExecutionPolicyявляется одной из стандартных политик,std::terminateвызывается. Для любой другойExecutionPolicy, поведение определяется реализацией. - Если алгоритм не может выделить память, выбрасывается
std::bad_alloc.
Примечания
Реализации (например, MSVC STL) могут использовать векторизацию, когда оба типа итераторов удовлетворяют LegacyContiguousIterator и имеют один и тот же тип значения, а тип значения является TriviallyCopyable.
Возможная реализация
См. также реализации в libstdc++, libc++ и 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;
} |
Пример
#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);
}Вывод:
1 2 3 3 2 1 1 2 3
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение, как опубликовано | Правильное поведение |
|---|---|---|---|
| LWG 2074 | C++98 | для каждого i, присваивание было*(d_first + N - i) = *(first + i)[1] |
исправлено на*(d_first + N - 1 - i) = *(first + i)[1] |
-
LegacyOutputIterator не требуется для поддержки бинарных
+и-. Использование+и-здесь носит только иллюстративный характер: фактическое вычисление не должно использовать их.
См. также
| меняет порядок элементов в диапазоне (функция-шаблон) |
|
|
(C++20) |
создаёт копию диапазона, который обращается вспять (niebloid) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/algorithm/reverse_copy