Программирование >>  Немодифицирующие последовательные алгоритмы 

1 ... 51 52 53 [ 54 ] 55 56 57 ... 78


из четырех элементов, требуется, следовательно, вызвать алгоритм 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);



1 ... 51 52 53 [ 54 ] 55 56 57 ... 78

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика