Różnice między wybraną wersją a wersją aktualną.
| Next revision | Previous revision | ||
|
rotate_rotate_copy [2009/04/28 10:37] tprzedpe utworzono |
rotate_rotate_copy [2009/04/28 15:07] (aktualna) tprzedpe |
||
|---|---|---|---|
| Linia 1: | Linia 1: | ||
| ====== Algorytmy rotate rotate_copy ====== | ====== 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). | 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 ===== | ||
| + | |||
| + | <code cpp> #include<algorithm> </code> | ||
| + | |||
| + | ===== Deklaracje rotate rotate_copy ===== | ||
| + | |||
| + | <code cpp>template <class ForwardIterator> | ||
| + | void rotate (ForwardIterator first, ForwardIterator middle, ForwardIterator last); | ||
| + | |||
| + | template <class ForwardIterator, class OutputIterator> | ||
| + | OutputIterator rotate_copy (ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result); | ||
| + | </code> | ||
| + | |||
| + | ===== 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 ===== | ||
| + | |||
| + | <code cpp> | ||
| + | #include <algorithm> | ||
| + | #include <vector> | ||
| + | #include <iostream> | ||
| + | |||
| + | 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<int> 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<int> v_rotate_copy1(arr, arr+7); | ||
| + | |||
| + | //Inicjalizacja wektora pustego | ||
| + | vector<int> 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; | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | 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 | ||
| + | |||