return 0; }

Программа выводит следующий текст:

Initial contents of array a:   10 20  30 40 After rotatefa,   a+1,   a+4):       20  30 40  10

Если после имеющегося в программе вызова rotate добавить следующий вызов:

rotatefa,   а+3  а+4);

элемент а[3] = 10 снова станет а[0], что восстановит в результате первона­чальную последовательность 10, 20, 30, 40.

В STL определена также функция rotate_copy, которая помещает ре­зультат циклического сдвига в другой контейнер, так что источник остает­ся неизменным. Контейнер-приемник задается четвертым аргументом функции, как в следующей программе:

// rotcopy.срр:  Алгоритм rotate_copy. iinclude <iostream> iinclude <algorithm> using namespace std;

int mainf)

{     int  a[4]   =   {10,   20,   30,   40},   b[4];

rotate_copy(a,   a+1,   a+4,  b);

copyfb,  b+4,   ostream_iterator<int>(cout,   "   "));

cout  «  endl;   //  Вывод:   20  30  40   10 return  0; }

7.2.4. Обменять

void swap

(T& x, T& у) ; void iter_swap

(ForwardIteratorl& a, ForwardIteratorl& b) ; ForwardIterator2 swap_ranges

(Forwardlteratorl firstl, Forwardlteratorl lastl, ForwardIterator2 first2);

Алгоритм swap меняет значения двух объектов одного и того же типа, как показывает следующая программа:

// swap.cpp: Поменять два значения. #include <iostream> #include <algorithm> using namespace std;

int mainO

{ double  a = 3.14159, b = 2.71828;

swap(a, b);

cout << a << " " << b << endl;

//  2.71828    3.14159

return 0; }

Если мы имеем два итератора, то можем использовать алгоритм iter_swap для обмена местами значений, на которые ссылаются эти итераторы, например:

//   it_swap.cpp:   Алгоритм iter_swap. #include  <iostream> #include  <list> #include <algorithm> using namespace  std;

int main()

{     list<int>  L;

list<int>::iterator  i,   j;

L.push_back(123) ;

L.push_back(456);

copy (L.begin () ,   L.endO,

ostream_iterator<int>(cout,   "   "));

cout  <<  endl;     //   Вывод:   123   456

i  = L.beginO ;

3 = i;

++J;

iter_swap(i,   j);

copy(L.beginO ,   L.endf),

ostream_iterator<int>(cout,   "   ")); cout  « endl;     //  Вывод:   456  123 return  0; }

Алгоритм swap_ranges меняет местами два диапазона значений. Эти кон­тейнеры не должны перекрываться, и они могут относиться к разным ти­пам, как показывает следующая программа:


<< назад вперед >>