Uzycie funkcji rotate() do rotacji tablicy

0

Witam,

chciałem użyć funkcji rotate() do rotacji elementów tablicy. I rotacja w prawo bardzo fajnie wychodzi, natomiast w lewo nie chce działać nawet przy ujemnych parametrach. Ktoś wie dlaczego? Zamieszczam kod mojego programu:

#include <iostream>
#include <algorithm>
#include <conio.h>

using namespace std;

int main()

{
int n ;       //ilość elementów tablicy
const int k = 1 ;       //przesuniecie
int i ;

const zakres = 5;

//if(k>n) k%=n;

int tab[zakres] ;

   cout << "Podaj ilosc elementow tablicy: ";   cin >> n ;

//   cout << "Podaj przesuniecie: " ;             cin >> k ;
   cout << endl;
   for(i=0; i<n; i++)
   {
       cout << "Wprowadz " << i << " element: ";
       cin >> tab[i] ;
   }

   cout << "Oryginalna tablica: " << endl;
   for (i = 0; i<n; i++)
   {
      cout << tab[i] << " ";
   }

   cout << endl << "ROTACJA W PRAWO:" << endl;
   rotate(tab, tab+k, tab+n) ;
   for (i=0; i<n; i++)
   {
      cout << tab[i] << " ";
   }

   cout << endl << "ROTACJA W LEWO:" << endl;
   rotate(tab, tab-(k+1), tab+n) ;
   for (i=0; i<n; i++)
   {
      cout << tab[i] << " ";
   }

getch();
return 0;
}
1

http://www.cplusplus.com/reference/algorithm/rotate/
middle - Forward iterator pointing to the element within the range [first,last) that is moved to the first position in the range.
rotate(tab, tab+n-k, tab+n) ;

1

http://www.cplusplus.com/reference/algorithm/rotate/
Nie wiem czy czytałeś dokumentację funkcji rotate(), ale jest tam napisane, że działa w taki sposób, że element middle staje się nowym pierwszym elementem. W związku z tym obrót następuje w zasadzie tylko w lewo. Do funkcji wchodzi ForwardIterator, więc ujemne parametry nie wchodzą w grę.

Powinieneś zauważyć, że obrót N-elementowej tablicy o k elementów w prawo to dokładnie to samo, co obrót o N-k elementów w lewo.

Edit Ewentualnie możesz wykorzystać std::vector i zrobić obrót na reverse_iterator, też będzie jak obrót „w drugą stronę”:

rotate(vec.begin(), mid, vec.end()); // obrot "w lewo"
rotate(vec.rbegin(), mid, vec.rend()); // obrot "w prawo"
0

Dziękuję, kierowałem się http://pl.wikibooks.org/wiki/C++/Algorytmy_w_STL/Operacje_zmieniaj%C4%85ce_kolejno%C5%9B%C4%87#rotate.28.29a tam jest dość skromnie na ten temat :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1