C++ Algorithm rotate
The rotate function in C++ Algorithm is employed to change the arrangement of elements in a specified range [first, last).
- The process initiates at the midpoint of the original sequence, with the final element positioned before the initial one.
- This rotation involves shifting elements from the middle to those between the middle and the last element.
Syntax
template <class ForwardIterator>
void rotate (ForwardIterator first, ForwardIterator middle,
ForwardIterator last); // until C++ 11
template <class ForwardIterator>
ForwardIterator rotate (ForwardIterator first, ForwardIterator middle,
ForwardIterator last); //since C++ 11
Parameter
A forward iterator indicating the location of the initial element within the range to undergo rotation.
A forward iterator pointing to the element in the range [first, last) that is shifted to the starting position within the range.
The final element in the range where the elements are being reversed is indicated by a forward iterator positioned one step beyond.
Return value
Complexity
The complexity increases linearly within the specified range [first, last) as elements are swapped or moved until all elements are successfully repositioned.
Data races
The elements within the range [first, last) undergo modifications.
Exceptions
This function will raise an exception if an error occurs during an element swap, move, or iterator operation.
Please be aware that using incorrect parameters can lead to unpredictable behavior.
Example 1
Let's explore a basic example demonstrating how to rotate a provided string:
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
int main() {
string str = "Hello";
cout << "Before Rotate : "<< str << endl;
rotate(str.begin(), str.begin() + 2, str.end());
cout <<"After Rotate : " << str << endl;
return 0;
}
Output:
Before Rotate : Hello
After Rotate : lloHe
Example 2
Let's see another simple example:
#include <iostream>
#include <algorithm>
#include <vector>
#include <iomanip>
using namespace std;
void print(char a[], int N)
{
for(int i = 0; i < N; i++)
{
cout << (i + 1) << ". " << setw(2)
<< left << a[i] << " ";
}
cout << endl;
}
int main()
{
char s[] = {'A', 'B', 'C', 'D', 'E', 'G', 'H'};
int slen = sizeof(s) / sizeof(char);
cout << "Original order : ";
print(s, slen);
cout << "Rotate with \'C\' as middle element" << endl;
rotate(s, s + 2, s + slen);
cout << "Rotated order : ";
print(s, slen);
cout << "Rotate with \'G\' as middle element" << endl;
rotate(s, s + 3, s + slen);
cout << "Rotated order : ";
print(s, slen);
cout << "Rotate with \'A\' as middle element" << endl;
rotate(s, s + 3, s + slen);
cout << "Original order : ";
print(s, slen);
return 0;
}
Output:
Original order : 1. A 2. B 3. C 4. D 5. E 6. G 7. H
Rotate with 'C' as middle element
Rotated order : 1. C 2. D 3. E 4. G 5. H 6. A 7. B
Rotate with 'G' as middle element
Rotated order : 1. G 2. H 3. A 4. B 5. C 6. D 7. E
Rotate with 'A' as middle element
Original order : 1. B 2. C 3. D 4. E 5. G 6. H 7. A
Example 3
Let's see another simple example:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main () {
vector<int> vec1{1,2,3,4,5,6,7,8,9};
// Print old vector
cout << "Old vector:";
for(int i=0; i < vec1.size(); i++)
cout << " " << vec1[i];
cout << "\n";
// Rotate vector left 3 times.
int rotL=3;
// rotate function
rotate(vec1.begin(), vec1.begin()+rotL, vec1.end());
// Print new vector
cout << "New vector after left rotation :";
for (int i=0; i < vec1.size(); i++)
cout<<" "<<vec1[i];
cout << "\n\n";
vector <int> vec2{1,2,3,4,5,6,7,8,9};
// Print old vector
cout << "Old vector:";
for (int i=0; i < vec2.size(); i++)
cout << " " << vec2[i];
cout << "\n";
// Rotate vector right 4 times.
int rotR = 4;
// std::rotate function
rotate(vec2.begin(), vec2.begin()+vec2.size()-rotR, vec2.end());
// Print new vector
cout << "New vector after right rotation :";
for (int i=0; i < vec2.size(); i++)
cout << " " << vec2[i];
cout << "\n";
return 0;
}
Output:
Old vector : 1 2 3 4 5 6 7 8 9
New vector after left rotation : 4 5 6 7 8 9 1 2 3
Old vector : 1 2 3 4 5 6 7 8 9
New vector after right rotation : 6 7 8 9 1 2 3 4 5
Example 4
Let's see another simple example:
#include <vector>
#include <deque>
#include <algorithm>
#include <iostream>
int main( ) {
using namespace std;
vector <int> v1;
deque <int> d1;
vector <int>::iterator v1Iter1;
deque<int>::iterator d1Iter1;
int i;
for ( i = -3 ; i <= 5 ; i++ )
{
v1.push_back( i );
}
int ii;
for ( ii =0 ; ii <= 5 ; ii++ )
{
d1.push_back( ii );
}
cout << "Vector v1 is ( " ;
for ( v1Iter1 = v1.begin( ) ; v1Iter1 != v1.end( ) ;v1Iter1 ++ )
cout << *v1Iter1 << " ";
cout << ")." << endl;
rotate ( v1.begin ( ) , v1.begin ( ) + 3 , v1.end ( ) );
cout << "After rotating, vector v1 is ( " ;
for ( v1Iter1 = v1.begin( ) ; v1Iter1 != v1.end( ) ;v1Iter1 ++ )
cout << *v1Iter1 << " ";
cout << ")." << endl;
cout << "The original deque d1 is ( " ;
for ( d1Iter1 = d1.begin( ) ; d1Iter1 != d1.end( ) ;d1Iter1 ++ )
cout << *d1Iter1 << " ";
cout << ")." << endl;
int iii = 1;
while ( iii <= d1.end ( ) - d1.begin ( ) ) {
rotate ( d1.begin ( ) , d1.begin ( ) + 1 , d1.end ( ) );
cout << "After the rotation of a single deque element to the back,\n d1 is ( " ;
for ( d1Iter1 = d1.begin( ) ; d1Iter1 != d1.end( ) ;d1Iter1 ++ )
cout << *d1Iter1 << " ";
cout << ")." << endl;
iii++;
}
}
Output:
Vector v1 is ( -3 -2 -1 0 1 2 3 4 5 ).
After rotating, vector v1 is ( 0 1 2 3 4 5 -3 -2 -1 ).
The original deque d1 is ( 0 1 2 3 4 5 ).
After the rotation of a single deque element to the back,
d1 is ( 1 2 3 4 5 0 ).
After the rotation of a single deque element to the back,
d1 is ( 2 3 4 5 0 1 ).
After the rotation of a single deque element to the back,
d1 is ( 3 4 5 0 1 2 ).
After the rotation of a single deque element to the back,
d1 is ( 4 5 0 1 2 3 ).
After the rotation of a single deque element to the back,
d1 is ( 5 0 1 2 3 4 ).
After the rotation of a single deque element to the back,
d1 is ( 0 1 2 3 4 5 ).