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 меняет местами два диапазона значений. Эти контейнеры не должны перекрываться, и они могут относиться к разным типам, как показывает следующая программа:
<< назад вперед >>