Namespaces
Variants

std::ranges::rotate_copy, std::ranges::rotate_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::forward_iterator I, std::sentinel_for<I> S,
          std::weakly_incrementable O >
requires std::indirectly_copyable<I, O>
constexpr rotate_copy_result<I, O>
    rotate_copy( I first, I middle, S last, O result );
(1) (начиная с C++20)
template< ranges::forward_range R, std::weakly_incrementable O >
requires std::indirectly_copyable<ranges::iterator_t<R>, O>
constexpr rotate_copy_result<ranges::borrowed_iterator_t<R>, O>
    rotate_copy( R&& r, ranges::iterator_t<R> middle, O result );
(2) (начиная с C++20)
Вспомогательные типы
template< class I, class O >
using rotate_copy_result = in_out_result<I, O>;
(3) (начиная с C++20)

Копирует левый поворот [first, last) в result.

1) Копирует элементы из исходного диапазона [first, last), так, чтобы в целевом диапазоне элементы из [first, middle) располагались после элементов из [middle, last), при этом порядок элементов в обоих диапазонах сохраняется.
Поведение не определено, если [first, middle) или [middle, last) не является допустимым диапазоном, или если исходный и целевой диапазоны перекрываются.
2) То же, что и (1), но использует r в качестве исходного диапазона, как если бы использовал ranges::begin(r) как first и ranges::end(r) как last.

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

Параметры

first, last - пара итератор-страж, определяющая исходный диапазон элементов для копирования
r - исходный диапазон элементов для копирования
middle - итератор на элемент, который должен находиться в начале целевого диапазона
result - начало целевого диапазона

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

{ last, result + N } , где N = ranges:: distance ( first, last ) .

Сложность

Линейная : ровно N присваиваний.

Примечания

Если тип значения является TriviallyCopyable и типы итераторов удовлетворяют требованиям contiguous_iterator , реализации ranges::rotate_copy обычно избегают множественных присваиваний, используя функции "массового копирования", такие как std::memmove .

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

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

struct rotate_copy_fn
{
    template<std::forward_iterator I, std::sentinel_for<I> S, std::weakly_incrementable O>
    requires std::indirectly_copyable<I, O>
    constexpr ranges::rotate_copy_result<I, O>
        operator()(I first, I middle, S last, O result) const
    {
        auto c1 {ranges::copy(middle, std::move(last), std::move(result))};
        auto c2 {ranges::copy(std::move(first), std::move(middle), std::move(c1.out))};
        return {std::move(c1.in), std::move(c2.out)};
    }
    template<ranges::forward_range R, std::weakly_incrementable O>
    requires std::indirectly_copyable<ranges::iterator_t<R>, O>
    constexpr ranges::rotate_copy_result<ranges::borrowed_iterator_t<R>, O>
        operator()(R&& r, ranges::iterator_t<R> middle, O result) const
    {
        return (*this)(ranges::begin(r), std::move(middle),
                       ranges::end(r), std::move(result));
    }
};
inline constexpr rotate_copy_fn rotate_copy {};

Пример

#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::ranges::find(src, 3);
    std::ranges::rotate_copy(src, pivot, dest.begin());
    for (int i : dest)
        std::cout << i << ' ';
    std::cout << '\n';
    // copy the rotation result directly to the std::cout
    pivot = std::ranges::find(dest, 1);
    std::ranges::rotate_copy(dest, pivot, std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
}

Вывод:

3 4 5 1 2
1 2 3 4 5

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

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