The Wayback Machine - https://web.archive.org/web/20180507215410/http://ru.cppreference.com:80/w/cpp/algorithm/rotate
Пространства имён
Варианты
Действия

std::rotate

Материал из cppreference.com
< cpp‎ | algorithm
 
 
Алгоритмы
Функции
Немодифицирующие линейные операции
Модифицирующие линейные операции
Разделение
Сортировка (на отсортированных промежутках)
Бинарный поиск (на отсортированных промежутках)
Множества (на отсортированных промежутках)
Куча
Минимум/максимум
Числовые операции
Библиотека C
 
Defined in header <algorithm>
template<class ForwardIt >

void rotate( ForwardIt first, ForwardIt n_first, ForwardIt last );
template<class ForwardIt >

ForwardIt rotate( ForwardIt first, ForwardIt n_first, ForwardIt last );
(до C++11)

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

Меняет местами элементы в диапазоне [first, last) таким образом, что элемент n_first становится первым в новом диапазоне, а n_first-1 — последним.

Содержание

[править]Параметры

first, last диапазон элементов для изменения их порядка
n_first элемент, который должен стать первым в новом диапазоне
Требования к типам
-
ForwardIt должен соответствовать требованиям ValueSwappable и ForwardIterator.
-
The type of dereferenced ForwardIt must meet the requirements of MoveAssignable and MoveConstructible.

[править]Возвращаемое значение

(Нет) (до C++11)

Итератор, равный first + (last - n_first). (начиная с C++11)

[править]Сложность

Линейная по расстоянию между first и last.

[править]Возможная реализация

template<class ForwardIt>void rotate(ForwardIt first, ForwardIt n_first, ForwardIt last){ ForwardIt next = n_first;while(first != next){std::swap(*first++, *next++);if(next == last){ next = n_first;}elseif(first == n_first){ n_first = next;}}}

[править]Пример

std::rotate — распространённый "строительный кирпичик" во многих алгоритмах. Этот пример демонстрирует сортировку вставками в C++.

#include <vector>#include <iostream>#include <algorithm>   std::ostream& operator<<(std::ostream& s, conststd::vector<int>& v){for(int n: v) s << n <<' ';return s;}   int main(){std::vector<int> v{2, 4, 2, 0, 5, 10, 7, 3, 7, 1};std::cout<<"до сортировки  : "<< v <<std::endl;   // сортировка вставкамиfor(auto i = v.begin(); i != v.end();++i){ std::rotate(std::upper_bound(v.begin(), i, *i), i, i+1);}std::cout<<"после сортировки: "<< v <<std::endl;   // вращение влево std::rotate(v.begin(), v.begin()+1, v.end());std::cout<<"после вращения влево : "<< v <<std::endl;   // вращение вправо std::rotate(v.rbegin(), v.rbegin()+1, v.rend());std::cout<<"после вращения вправо: "<< v <<std::endl;}

Вывод:

до сортировки  : 2 4 2 0 5 10 7 3 7 1 после сортировки: 0 1 2 2 3 4 5 7 7 10 после вращения влево : 1 2 2 3 4 5 7 7 10 0 после вращения вправо: 0 1 2 2 3 4 5 7 7 10

[править]См. также

копирует и вращать в диапазоне элементов
Оригинал:
copies and rotate a range of elements
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(шаблон функции)[править]
close