|
Программирование >> Немодифицирующие последовательные алгоритмы
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. Вместо того чтобы указывать количество позиций и направление сдвига, мы просто задаем элемент, который должен стать первым. Аргумент функции, используемый для этой цели, следует вторым, а первый и третий аргументы определяют диапазон, к которому применяется циклический сдвиг. Чтобы осуществить сдвиг в приведенном выше примере для массива
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |