====== Algorytmy rotate rotate_copy ======
Algorytmy zamieniają segment zawierający elementy od pierwszego (first) do środkowego – 1 (middle – 1) z segmentem który zawiera elementy od środkowego (middle) do ostatniego (last).
===== Nagłówek =====
#include
===== Deklaracje rotate rotate_copy =====
template
void rotate (ForwardIterator first, ForwardIterator middle, ForwardIterator last);
template
OutputIterator rotate_copy (ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result);
===== Parametry =====
Wspólne:
* first – wskazuje na początek sekwencji wszystkich elementów
* middle – wskazuje na element rozdzielający dwa segmenty poddane zamianie
* last – wskazuje na koniec sekwencji wszystkich elementów
rotate_copy:
* result - wskazuje na kontener do którego zostanie zapisany wynik
===== Działanie =====
Rotate zamienia segment zawierający elementy od first do middle – 1 z segmentem który zawiera elementy od middle do last. Po tym jak rotate() zostanie zastosowany element który znajdował się na pozycji middle znajduje się na pozycji first, a pozostałe elementy segmentu (middle , last) znajdują się na tych samych pozycjach względem siebie co wcześniej (np. element middle znajduje się na pozycji first, a element middle + 1 na pozycji first +1). Element który znajdował się na pozycji first teraz znajduje nie na pozycji last – (middle + 1). Podobnie jak w przypadku poprzedniego segmentu elementy zachowują swoją kolejność względem siebie.
Przykład ilustrujący zastosowanie rotate():
2 4 6 8 1 3 5
Jeśli użyjemy funkcji rotate() z argumentem middle = 5, otrzymamy dwa segmenty:
2 4 6 8 oraz 1 3 5
Po wykonaniu się funkcji otrzymamy sekwencje:
1 3 5 2 4 6 8
Element który znajdował się na piątej pozycji teraz znajduje się na pozycji pierwszej, a element który znajdował się na pozycji pierwszej teraz znajduje się na pozycji czwartej (last – (middle + 1), czyli 8 – 5 + 1 = 4).
Algorytm rotate_copy działa na identycznej zasadzie co powyżej opisany algorytm rotate, lecz zamiast zmieniać oryginalną sekwencji kopiuje wynik do kontenera wskazanego przez argument result. Elementy z zakresu (first, last) są kopiowane do zakresu (result, result + (last – first)).
===== Przykład użycia =====
#include
#include
#include
using namespace std;
int main()
{
//rotate:
cout << "rotate:" << endl << endl;
//Inicjalizacja wektora przy użyciu tablicy int
int arr[7] = {2,4,6,8,1,3,5};
vector v_rotate(arr, arr+7);
//Wydruk elementów przed użyciem algorytmu
cout << "Elementy przed rotate: " << endl << " ";
for (int i = 0; i < 7; i++)
{
cout << v_rotate[i] << " ";
}
cout << endl << endl;
// Wydruk: 2 4 6 8 1 3 5
//Rotacja
rotate(v_rotate.begin(), v_rotate.begin()+4, v_rotate.end());
//Wydruk elementów po użyciu algorytmu
cout << "Elementy po rotate dla middle = 5: " << endl << " ";
for (int i = 0; i < 7; i++)
{
cout << v_rotate[i] << " ";
}
cout << endl << endl;
// Wydruk: 1 3 5 2 4 6 8
//rotate_copy:
cout << "rotate_copy:" << endl << endl;
//Inicjalizacja wektora przy użyciu tablicy int
vector v_rotate_copy1(arr, arr+7);
//Inicjalizacja wektora pustego
vector v_rotate_copy2(7);
//Wydruk elementów przed użyciem algorytmu
cout << "Elementy przed rotate_copy: " << endl << " ";
for (int i = 0; i < 7; i++)
{
cout << v_rotate_copy1[i] << " ";
}
cout << endl << endl;
// Wydruk: 2 4 6 8 1 3 5
//Rotacja
rotate_copy(v_rotate_copy1.begin(), v_rotate_copy1.begin()+4, v_rotate_copy1.end(), v_rotate_copy2.begin());
//Wydruk elementów po użyciu algorytmu
cout << "Elementy po rotate_copy dla middle = 5: " << endl << " ";
cout << "wektor wejściowy:" << endl << " ";
for (int i = 0; i < 7; i++)
{
cout << v_rotate_copy1[i] << " ";
}
cout << endl << " ";
// Wydruk 2 4 6 8 1 3 5
cout << "wektor wyjściowy:" << endl << " ";
for (int i = 0; i < 7; i++)
{
cout << v_rotate_copy2[i] << " ";
}
cout << endl << endl;
// Wydruk: 1 3 5 2 4 6 8
return 0;
}
Uzyskany wydruk:
rotate:
Elementy przed rotate:
2 4 6 8 1 3 5
Elementy po rotate dla middle = 5:
1 3 5 2 4 6 8
rotate_copy:
Elementy przed rotate_copy:
2 4 6 8 1 3 5
Elementy po rotate_copy dla middle = 5:
wektor wejściowy:
2 4 6 8 1 3 5
wektor wyjściowy:
1 3 5 2 4 6 8