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: |
| (до C++20) |
|
| (начиная с 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
См. также
| изменяет порядок элементов в диапазоне (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
|
(C++20) | копирует и циклически сдвигает диапазон элементов (функциональный объект-алгоритм) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/rotate_copy