Spec-Zone.ru › C++

std::rotate_copy

Объявлено в заголовочном файле <algorithm>
template< class ForwardIt, class OutputIt >
OutputIt rotate_copy( ForwardIt first, ForwardIt middle,
                      ForwardIt last, OutputIt d_first );
(1) (constexpr с C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2 >
ForwardIt2 rotate_copy( ExecutionPolicy&& policy,
                        ForwardIt1 first, ForwardIt1 middle,
                        ForwardIt1 last, ForwardIt2 d_first );
(2) (с C++17)

Копирует левый циклический сдвиг [first, last) в d_first.

1) Копирует элементы из диапазона [first, last) так, что в целевом диапазоне, начинающемся с d_first, элементы из [first, middle) располагаются после элементов из [middle, last), при этом порядок элементов в обоих диапазонах сохраняется.
2) То же, что и (1), но выполняется согласно policy.
Эта перегрузка участвует в разрешении перегрузки, только если значение следующего выражения равно true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(до C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(начиная с C++20)

Если выполняется любое из следующих условий, поведение не определено:

  • [first, middle) или [middle, last) не является допустимым диапазоном.
  • Исходный и целевой диапазоны перекрываются.

Параметры

first, last - пара итераторов, определяющая исходный диапазон копируемых элементов
middle - итератор на элемент в [first, last), который должен оказаться в начале нового диапазона
d_first - начало целевого диапазона
policy - политика выполнения, которую следует использовать
Требования к типам
-ForwardIt, ForwardIt1, ForwardIt2 должен соответствовать требованиям LegacyForwardIterator.
-OutputIt должен соответствовать требованиям LegacyOutputIterator.

Возвращаемое значение

Выходной итератор на элемент, следующий за последним скопированным элементом.

Сложность

Ровно std::distance(first, last) присваиваний.

Исключения

Перегрузка с параметром шаблона с именем ExecutionPolicy сообщает об ошибках следующим образом:

  • Если выполнение функции, вызванной в ходе работы алгоритма, приводит к выбросу исключения и ExecutionPolicy является одной из стандартных политик, вызывается std::terminate. Для любого другого ExecutionPolicy поведение определяется реализацией.
  • Если алгоритму не удаётся выделить память, выбрасывается std::bad_alloc.

Возможная реализация

См. также реализации в libstdc++, libc++ и MSVC STL.

template<class ForwardIt, class OutputIt>
constexpr // since C++20
OutputIt rotate_copy(ForwardIt first, ForwardIt middle,
                     ForwardIt last, OutputIt d_first)
{
    d_first = std::copy(middle, last, d_first);
    return std::copy(first, middle, d_first);
}

Пример

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>

int main()
{
    std::vector<int> src{1, 2, 3, 4, 5};
    std::vector<int> dest(src.size());
    auto pivot = std::find(src.begin(), src.end(), 3);
    
    std::rotate_copy(src.begin(), pivot, src.end(), dest.begin());
    for (int i : dest)
        std::cout << i << ' ';
    std::cout << '\n';
    
    // copy the rotation result directly to the std::cout
    pivot = std::find(dest.begin(), dest.end(), 1);
    std::rotate_copy(dest.begin(), pivot, dest.end(),
                     std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
}

Вывод:

3 4 5 1 2
1 2 3 4 5

См. также

rotate
изменяет порядок элементов в диапазоне
(шаблон функции и функциональный объект-алгоритм)
ranges::rotate
(C++20)
ranges::rotate_copy
(C++20)
копирует и циклически сдвигает диапазон элементов
(функциональный объект-алгоритм)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/rotate_copy

Spec-Zone.ru

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