Spec-Zone.ru › C++

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)
1) Дано \(\scriptsize N\)N как std::distance(first, last). Копирует элементы из диапазона [first, last) в другой диапазон из \(\scriptsize N\)N элементов, начинающийся в d_first (диапазон назначения), таким образом, что элементы в диапазоне назначения расположены в обратном порядке.
Ведёт себя так, как если бы выполнение присваивания *(d_first + N - 1 - i) = *(first + i)[1] осуществлялось один раз для каждого целого i в [​0​, N).
Если [first, last) и диапазон назначения перекрываются, поведение не определено.
2) То же, что (1), но выполняется согласно policy. Этот перегрузка не участвует в разрешении перегрузки, если

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> является true.

(до C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> является true.

(с 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]
  1. LegacyOutputIterator не требуется для поддержки бинарных + и -. Использование + и - здесь носит только иллюстративный характер: фактическое вычисление не должно использовать их.

См. также

reverse
меняет порядок элементов в диапазоне
(функция-шаблон)
ranges::reverse_copy
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API