std::reverse_copy
Определён в заголовочном файле <algorithm> | ||
|---|---|---|
template< class BidirIt, class OutputIt >
OutputIt reverse_copy( BidirIt first, BidirIt last,
OutputIt d_first );
| (1) | (constexpr с 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), как если бы оно выполнялось именно так.policy.true: |
| (до 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.
Возможная реализация
См. также реализации в 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;
}
|
Примечания
Реализации (например, MSVC STL) могут включать векторизацию, если оба типа итераторов удовлетворяют требованиям LegacyContiguousIterator и имеют одинаковый тип значения, а тип значения является TriviallyCopyable.
Пример
#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++.
| Отчёт об ошибке | Применяется к | Поведение согласно опубликованному стандарту | Исправленное поведение |
|---|---|---|---|
| LWG 2074 | C++98 | для каждого i выполнялось присваивание*(d_first + N - i) = *(first + i)[1] | исправлено на*(d_first + N - 1 - i) = *(first + i)[1] |
| LWG 2150 | C++98 | требовалось присвоить значение только одному элементу | требование исправлено |
- LegacyOutputIterator не обязан поддерживать бинарные операторы
+и-. Использование+и-здесь приведено только для пояснения: фактическое вычисление не обязано их использовать.
См. также
| изменяет порядок элементов в диапазоне на обратный (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
|
(C++20) | создаёт копию диапазона с элементами в обратном порядке (функциональный объект-алгоритм) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/reverse_copy