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

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


transfer.срр: Два алгоритма transform. #include <iostream> #include <vector> #include <algorithm> using namespace std;

int plusl(int x){return x + 1;}

int largersq(int x, int у){return x > у ? x*x : y*y;} int mainO

{ int a[5] = {2, -4, 3, 5, 1}, b[5] = {1, -3, 5, 2, 4}; vector<int> result; transform(a, a+5,

inserter(result, result.begin()), plusl); copy(result.begin(), result.end(),

ostream iterator<int>(cout, )); cout << endl; Вывод: 3-3462 transform(a, a+5, b, result.begin(), largersq); copy(result.begin 0, result.end(),

ostream iterator<int>(cout, )); cout endl; Вывод: 4 9 25 25 16 return 0;

Как указано в комментариях, первый результат получается добавлением единицы ко всем элементам массива а. Второй вызов transform вычисляет квадрат большего из соответствующих элементов массивов а и 6. К примеру, result[Qi\ = 4, потому что это квадрат большего значения (2) из а[0] и 6[0].

7.2.2. Копировать

OutputIterator copy

(Inputlterator first, Inputlterator last, Outputlterator result); BidirectionalIterator2 copy backward (Bidirectionallteratorl firstl, Bidirectionallteratorl lastl, BidirectionalIterator2 last2);

Алгоритм copy рассматривался в разделе 1.6. В примерах этого раздела источник и приемник копирования никогда не перекрывались. Если же они перекрываются, необходимо правильно выбрать, какой из алгоритмов использовать: сору, который копирует элементы в прямом порядке, либо сору backward, копирующий в обратном порядке. Например, если мы хотим сдвинуть элементы а[1], а[2] и а[3] массива а на одну позицию влево, самый элементарный способ достичь этого следующий:

for (i=l; i<4; i++) a[i-l] = a[i];



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

сору1.срр: Сдвиг элементов массива влево. #include <iostream> #include <algorithm> using namespace std;

int mainO

{ int a[4] = {10, 20, 30, 40}, i; cout Before shifting left: ; for (i=0; i<4; i++) cout << a[i] << ; copy(a+l, a+4, a); cout << \nAfter shifting left: for (i=0; i<4; i++) cout << a[i] << ; cout << endl; return 0;

Напомним, что первые два параметра сору задают источник, а третий - приемник. Программа сдвигает три элемента массива влево, как видно из ее вывода:

Before shifting left: 10 20 30 40 After shifting left: 20 30 40 40

Противоположная операция - сдвиг элементов а[0], а[1] и а[2] массива, содержащего четыре элемента, вправо - может быть проведена следующим образом:

for (i=2; i>=0; i--) a[i+l] = a[i];

Обратите внимание, что мы должны двигаться назад, уменьшая i. Программа, приведенная ниже, показывает, что алгоритм copyjbackward делает то же самое:

сору2.срр: Сдвиг элементов массива вправо. #include <iostream> #include <algorithm> using namespace std;

int mainO

{ int a[4] = {10, 20, 30, 40}, i; cout << Before shifting right: ; for (i=0; i<4; i++) cout a[i] ; copy backward(a, a+3, a+4); cout \nAfter shifting right: for (i=0; i<4; i++) cout << a[i] ; cout << endl; return 0;



Как и для сору, первые два аргумента сору backward указывают источник. Однако третий аргумент указывает позицию за последним элементом приемника; другими словами, это значение будет уменьшаться перед каждым шагом алгоритма, включая первый шаг. Вывод этой программы следующий:

Before shifting right: 10 20 30 40 After shifting right: 10 10 20 30

В рассмотренных программах несколько раз встречается строчка:

for (i=0; i<4; i++) cout a[i] ;

Вместо нее мы можем использовать тот же алгоритм сору, как рассказано ранее в разделе 1.9:

сору(а, а+4, ostream iterator<int>(cout, ));

В некоторых дальнейших примерах нами будет использован также и этот метод.

7.2.3. Переместить по кругу

void rotate

(Forwardlterator first, Forwardlterator middle,

Forwardlterator last); Outputlterator rotate copy

(Forwardlterator first, Forwardlterator middle,

Forwardlterator last, Outputlterator result);

Иногда возникает необходимость вместо сдвига на несколько позиций влево или вправо переместить элементы последовательного контейнера по кругу. Например, преобразовать

10 20 30 40

в следующую последовательность

20 30 40 10

Это преобразование может считаться циклическим сдвигом влево на одну позицию. Однако с таким же успехом мы можем считать его циклическим сдвигом вправо на три позиции. Поэтому существует только один алгоритм rotate. Вместо того чтобы указывать количество позиций и направление сдвига, мы просто задаем элемент, который должен стать первым. Аргумент функции, используемый для этой цели, следует вторым, а первый и третий аргументы определяют диапазон, к которому применяется циклический сдвиг. Чтобы осуществить сдвиг в приведенном выше примере для массива



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

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