std::ranges::reverse_copy, std::ranges::reverse_copy_result
| Определено в заголовке <algorithm>
|
||
| Сигнатура вызова |
||
template< std::bidirectional_iterator I, std::sentinel_for<I> S,
std::weakly_incrementable O >
requires std::indirectly_copyable<I, O>
constexpr reverse_copy_result<I, O>
reverse_copy( I first, S last, O result );
|
(1) | (начиная с C++20) |
template< ranges::bidirectional_range R, std::weakly_incrementable O >
requires std::indirectly_copyable<ranges::iterator_t<R>, O>
constexpr reverse_copy_result<ranges::borrowed_iterator_t<R>, O>
reverse_copy( R&& r, O result );
|
(2) | (начиная с C++20) |
| Вспомогательные типы |
||
template< class I, class O >
using reverse_copy_result = ranges::in_out_result<I, O>;
|
(3) | (начиная с C++20) |
[first, last) в целевой диапазон [result, result + N), где N равно ranges::distance(first, last), таким образом, что элементы в новом диапазоне располагаются в обратном порядке. Ведёт себя так, как если бы выполнялось присваивание *(result + N - 1 - i) = *(first + i) один раз для каждого целого числа i в интервале [0, N). Поведение не определено, если исходный и целевой диапазоны перекрываются.r в качестве исходного диапазона, как если бы использовались ranges::begin(r) в качестве first и ranges::end(r) в качестве last.Описанные на этой странице функциональные сущности являются объектами-функциями алгоритмов (неформально известными как niebloids), то есть:
- Явные списки аргументов шаблона не могут быть указаны при вызове любой из них.
- Ни одна из них не видна при поиске, зависящем от аргументов.
- Если какая-либо из них находится с помощью обычного неквалифицированного поиска как имя слева от оператора вызова функции, поиск, зависящий от аргументов, подавляется.
Параметры
| first, last | - | пара итератор-страж, определяющая исходный диапазон элементов для копирования |
| r | - | исходный диапазон элементов для копирования |
| result | - | начало целевого диапазона. |
Возвращаемое значение
{ last, result + N } .
Сложность
Ровно
N
заданий.
Примечания
Реализации (например,
MSVC STL
) могут использовать векторизацию, когда оба типа итераторов моделируют
contiguous_iterator
и имеют одинаковый тип значения, а тип значения является
TriviallyCopyable
.
Возможная реализация
Смотрите также реализации в MSVC STL и libstdc++ .
struct reverse_copy_fn { template<std::bidirectional_iterator I, std::sentinel_for<I> S, std::weakly_incrementable O> requires std::indirectly_copyable<I, O> constexpr ranges::reverse_copy_result<I, O> operator()(I first, S last, O result) const { auto ret = ranges::next(first, last); for (; last != first; *result = *--last, ++result); return {std::move(ret), std::move(result)}; } template<ranges::bidirectional_range R, std::weakly_incrementable O> requires std::indirectly_copyable<ranges::iterator_t<R>, O> constexpr ranges::reverse_copy_result<ranges::borrowed_iterator_t<R>, O> operator()(R&& r, O result) const { return (*this)(ranges::begin(r), ranges::end(r), std::move(result)); } }; inline constexpr reverse_copy_fn reverse_copy {}; |
Пример
#include <algorithm> #include <iostream> #include <string> int main() { std::string x {"12345"}, y(x.size(), ' '); std::cout << x << " → "; std::ranges::reverse_copy(x.begin(), x.end(), y.begin()); std::cout << y << " → "; std::ranges::reverse_copy(y, x.begin()); std::cout << x << '\n'; }
Вывод:
12345 → 54321 → 12345
Смотрите также
|
(C++20)
|
изменяет порядок элементов в диапазоне на обратный
(функциональный объект алгоритма) |
|
создаёт копию диапазона в обратном порядке
(шаблон функции) |