Narzędzia użytkownika

Narzędzia witryny


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).

Nagłówek

 #include<algorithm> 

Deklaracje rotate rotate_copy

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);

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 <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;
 }

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
rotate_rotate_copy.txt · ostatnio zmienione: 2009/04/28 15:07 przez tprzedpe