Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

22.6.3. Реверсування послідовності

У програмах часто використовують алгоритм reverse(), який у діапазоні, заданому параметрами start і end, змінює порядок слідування елементів на протилежний. Його загальний формат має такий вигляд:

template <class BiIter> void reverse(BiIter start, BiIter end);

У наведеному нижче коді програми продемонстровано механізм використання цього алгоритму.

Код програми 22.15. Демонстрація механізму використання алгоритму reverse

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

#include <vector> // Для роботи контейнерним класом "Вектор"

#include <algorithm> // Для роботи з алгоритмами бібліотеки STL

using namespace std; // Використання стандартного простору імен

int main()

{

vector<int> vek;

unsigned int i;

for(i=0; i<10; i++) vek.push_back(i);

cout << "Початкова послідовність: ";

for(i=0; i<vek.size(); i++) cout << vek[i] << " ";

cout << endl;

reverse(vek. begin(), vek.end());

cout << "Реверсована послідовність: ";

for(i=0; i<vek.size(); i++) cout << vek[i] << " ";

getch(); return 0;

}

Результати виконання цієї програми є такими:

Початкова послідовність: 0 1 2 3 4 5 6 7 8 9

Реверсована послідовність: 9 8 7 6 5 4 3 2 1 0

22.6.4. Перетворення послідовності

Одним з найцікавіших алгоритмів є transform(), оскільки він дає змогу модифікувати кожен елемент у діапазоні відповідно до заданої функції. Алгоритм transform() використовується у двох загальних форматах:

template <class InIter, class OutIter, class Funс>

OutIter transform(InIter start, InIter end,

OutIter result, Funс unaryfunc);

template <class InIter1, class InIter2, class OutIter, class Funс>

OutIter transform(InIter1 start1, InIter1 end1,

InIterstart2, OutIter result, Funс binaryfunc);

Алгоритм transform() застосовує функцію до діапазону елементів і зберігає результат у послідовності, яка задається параметром resultУ першій формі діапазон задається параметрами start і end. Використовувана для перетворення функція задається параметром unaryfunc. Вона приймає значення елемента як параметр і повинна повернути перетворене значення. У другому форматі алгоритму перетворення виконується з використанням бінарної функції, яка приймає як перший параметр значення призначеного для перетворення елемента з послідовності, а як другий параметр – елемент з другої послідовності. Обидві версії повертають ітератор, який вказує на кінець остаточної послідовності.

У наведеному нижче коді програми використовується проста функція перетворення xform(), яка підносить до квадрату кожен елемент списку. Звернемо Вашу увагу на те, що остаточна послідовність зберігається у тому ж списку, який містив початкову послідовність.

Код програми 22.16. Демонстрація механізму використання алгоритму transform

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

#include <list> // Для роботи зі списками

#include <algorithm> // Для роботи з алгоритмами бібліотеки STL

using namespace std; // Використання стандартного простору імен

// Проста функція перетворення.

int xform(int i) {

return i * i; // Квадрат початкового значення

}

int main()

{

list<int> x1;

int i;

// Поміщаємо значення у список.

for(i=0; i<10; i++) x1.push_back(i);

cout << "Початковий список x1: ";

list<int>::iterator p = x1.begin();

while(p != x1.end()) {

cout << *p << " ";

p++;

}

cout << endl;

// Перетворення списку x1.

p = transform(x1.begin(), x1.end(), x1.begin(), xform);

cout << "Перетворений список x1: ";

p = x1.begin();

while(p != x1.end()) {

cout << *p << " ";

p++;

}

getch(); return 0;

}

У процесі виконання ця програма відображає на екрані такі результати:

Початковий список x1: 0 1 2 3 4 5 6 7 8 9

Перетворений список x1: 0 1 4 9 16 25 36 49 64 81

Як бачите, кожен елемент у списку x1 тепер зведений у квадрат.