|
Программирование >> Немодифицирующие последовательные алгоритмы
из четырех элементов, требуется, следовательно, вызвать алгоритм rotate следующим образом: rotate(a, а+1, а+4); Параметр а+1 показывает, что элемент а[1] = 20 должен стать первым в новой последовательности. Целиком программа приведена ниже: rotate.срр: Циклический сдвиг, iinclude <iostream> iinclude <algorithm> using namespace std; int main!) { int a[4] = {10, 20, 30, 40}; cout << Initial contents of array a: ; copy(a, a+4, ostream iterator<int>(cout, )); rotate(a, a+1, a+4); cout \nAfter rotate(a, a+1, a+4): copy(a, a+4, ostream iterator<int>(cout, )); cout endl; return 0; Программа выводит следующий текст: Initial contents of array a: 10 20 30 40 After rotate(a, a+1, a+4): 20 30 40 10 Если после имеющегося в программе вызова mtate добаврпъ следующий вызов: rotate(a, а+3 а+4); элемент a[3J = 10 снова станет а[0], что восстановит в результате первоначальную последовательность 10, 20, 30, 40. В STL определена также функция rotatejcopy, которая помещает результат циклического сдвига в другой контейнер, так что источник остается неизменным. Контейнер-приемник задается четвертым аргументом функции, как в следующей программе: rotсору.срр: Алгоритм rotate copy. iinclude <iostream> iinclude <algorithm> using namespace std; int mainO { int a[4] = {10, 20, 30, 40}, b[4]; rotate copy(a, a+1, a+4, b); copy(b, b+4, ostream iterator<int>(cout, )); Если мы имеем два рггератора, то можем использовать алгоритм iter swap для обмена местами значений, на которые ссылаются эти рггераторы, например: it swap.cpp: Алгоритм iter swap. #include <iostream> #include <list> #include <algorithm> using namespace std; int mainO { list<int> L; list<int>::iterator i, j; L.push back(123) ; L.push back(456) ; copy (L. begin 0 , L.endO, ostream iterator<int>(cout, )); cout endl; Вывод: 123 456 i = L.begin(); cout endl; Вывод: 20 30 40 10 return 0; 7.2.4. Обменять void swap (Т& X, Т& у) ; void iter spvap (ForwardIteratorl& a, ForwardIteratorl& b); ForwardIterator2 swap ranges (Forwardlteratorl firstl, Forwardlteratorl lastl, ForwardIterator2 first2); Алгоритм swap меняет значения двух объектов одного и того же типа, как показывает следующая программа: swap.срр: Поменять два значения. #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; j = i; ++j; iter swap(i, j); copy (L. begin 0 , L.endO, ostream iterator<int> (cout, )); cout endl; Вывод: 456 123 return 0; Алгоритм swap ranges меняет местами два диапазона значений. Эти контейнеры не должны перекрываться, и они могут относиться к разным типам, как показывает следующая программа: swranges.срр: Поменять местами диапазоны значений, iinclude <iostream> iinclude <vector> iinclude <algorithin> using namespace std; int mainO { int a[3] = {10, 20, 30}; vector<int> v; v.push back(100); v.push back(200); v.push back(300); swap ranges (v.begin () , v.endO, a); cout << After swap ranges:\n ; cout << i a[i] v[i]\n ; for (int i=0; i<3; i++) cout i << << a[i] v[i] << endl; return 0; Вывод программы: After swap ranges: i a[i] v[i] 0 100 10 1 200 20 2 300 30 Как видно из рассмотренного примера программы, первые два аргумента функции swap ranges задают один диапазон, а третий аргумент задает начало второго диапазона. Поскольку операция обмена симметрична по отношению к своим аргументам, программа будет работать точно так же, если мы заменим вызов swap ranges (v.begin О , v.endO, а); swap ranges (а, а+3, v.beginO);
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |