Namespaces
Variants

std::ranges::reverse_copy, std::ranges::reverse_copy_result

С сайта ru.cppreference.net
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы для диапазонов (C++20)
Ограниченные алгоритмы, например, ranges::copy, ranges::sort, ...
Операции непоследовательного изменения    
Пакетные операции
(C++17)
Операции поиска
Операции изменения последовательности
Операции копирования
(C++11)
(C++11)
Операции обмена
Операции преобразования
Операции генерации
Операции удаления
Операции изменения порядка
(до C++17)(C++11)
(C++20)(C++20)
Операции выборки
(C++17)

Сортировка и связанные операции
Операции разделения
(C++11)    

Операции сортировки
Операции бинарного поиска
(на разбитых диапазонах)
Операции над множествами (на отсортированных диапазонах)
Операции слияния (на отсортированных диапазонах)
Операции с кучей
Операции минимума/максимума
(C++11)
(C++17)
Операции лексикографического сравнения
Операции перестановки


Политики выполнения (C++17)
(только для пояснения*)(C++26)

Численные операции
(C++11)
(C++17)
(C++17)    

Специализированные <memory> алгоритмы

Специализированные <random> алгоритмы
Библиотека C









 
Ограниченные алгоритмы
Все имена в этом меню принадлежат пространству имён std::ranges
Операции непоследовательного изменения
Операции изменения последовательности
Операции разделения
Операции сортировки
Операции бинарного поиска (на отсортированных диапазонах)
       
       
Операции над множествами (на отсортированных диапазонах)
Операции с кучей
Операции минимума/максимума
       
       
Операции перестановки
Операции свертки
Операции над неинициализированной памятью
Типы возврата
 
Определено в заголовке <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)
1) Копирует элементы из исходного диапазона [first, last) в целевой диапазон [result, result + N), где N равно ranges::distance(first, last), таким образом, что элементы в новом диапазоне располагаются в обратном порядке. Ведёт себя так, как если бы выполнялось присваивание *(result + N - 1 - i) = *(first + i) один раз для каждого целого числа i в интервале [0, N). Поведение не определено, если исходный и целевой диапазоны перекрываются.
2) То же, что и (1), но использует 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

Смотрите также

изменяет порядок элементов в диапазоне на обратный
(функциональный объект алгоритма)
создаёт копию диапазона в обратном порядке
(шаблон функции)