Шаблонна функція std::rotate призначена для відносної зміни порядку послідовності. Функція поводить себе приблизно так, як це робить оператор зсуву ">>" або "<<". Оголошення даної шаблонної функції виглядає наступним чином:
template <class ForwardIterator>
void rotate (ForwardIterator begin, ForwardIterator middle, ForwardIterator end) ;
Усі параметрами являються ітераторами. Параметр begin вказує на початок послідовності яка буде зміщуватись. Параметр end вказує на кінець послідовності, яка буде зміщуватись. Ітератор middle вказує на елемент послідовності, який після виконання роботи функцією буде розміщуватись на початку вказаної послідовності. Після нього будуть розміщуватись елементи, які до виклику функції розміщувались поза ним і елементи які стояли перед даним елементом в відносному порядку. Тобто послідовність з порядком [begin,middle] [middle, end) перетворюється на послідовність з порядком [middle, end) [begin, middle).
Функція не повертає значень.
Приклад
Приклад #1
Розглянемо приклад використання даного алгоритму на масиві цілих чисел.
#include <algorithm> /* усі корисні алгоритми включно з max_element */
#include <iostream> /* об'єкт cout */
using namespace std ; /* друкуємо усе без std */
/* головна функція програми */
int main (int argc, char** argv)
{
/* створюємо піддослідний масив цілих чисел і визначаємо його довжину */
int iArray [] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} ;
int iLen = sizeof(iArray)/sizeof(iArray[0]) ;
/* виводимо оригінальний порядок масиву */
cout << "Оригінальний порядок масиву:" << endl ;
for (unsigned int iter=0; iter<iLen; ++iter)
{ cout << iArray [iter] << "; " ; }
cout << endl ;
/* застосовуємо алгоритм rotate */
rotate (iArray, iArray+((iLen-2)/2), iArray+(iLen-2)) ;
/* виводимо новий порядок масиву */
cout << "Новий порядок масиву:" << endl ;
for (unsigned int iter=0; iter<iLen; ++iter)
{ cout << iArray [iter] << "; " ; }
cout << endl ;
return 0 ;
}
Вивід програми:
Приклад #2
Переглянемо попередній приклад, відредагований для демонстрації з класом std::vector.
#include <algorithm> /* усі корисні алгоритми включно з max_element */
#include <vector>
#include <iostream> /* об'єкт cout */
using namespace std ; /* друкуємо усе без std */
/* головна функція програми */
int main (int argc, char** argv)
{
/* створюємо піддослідний масив цілих чисел і визначаємо його довжину */
int iArray [] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} ;
int iLen = sizeof(iArray)/sizeof(iArray[0]) ;
vector <int> viElems (iArray, iArray+iLen) ;
/* виводимо оригінальний порядок масиву */
cout << "Оригінальний порядок вектора:" << endl ;
for (unsigned int iter=0; iter<viElems.size(); ++iter)
{ cout << viElems [iter] << "; " ; }
cout << endl ;
/* застосовуємо алгоритм rotate */
rotate (viElems.begin(), viElems.begin()+(viElems.size()/2), viElems.end()-3) ;
/* виводимо новий порядок масиву */
cout << "Новий порядок вектора:" << endl ;
for (unsigned int iter=0; iter<viElems.size(); ++iter)
{ cout << viElems [iter] << "; " ; }
cout << endl ;
return 0 ;
}
Вивід програми: