Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
77
Добавлен:
07.03.2016
Размер:
1.78 Mб
Скачать

11.3.4 Узагальнені чисельні алгоритми

Для використання чисельних алгоритмів потрібно підключити заголовний файл <numeric>.

Таблиця 11.6. Узагальнені чисельні алгоритми

Алгоритм

Виконувана функція

accumulate

Накопичення

inner_product

Скалярний добуток

partial_sum

Розрахунок суми з накопиченням

adjacent_difference

Обчислення різниці між суміжними елементами

Алгоритм accumulate.

Перша форма алгоритму accumulate використовується для накопичення суми елементів послідовності, заданої ітераторами first і last. Початкове значення суми (звичайно це 0) задається третім параметром. Тип цього параметра визначає тип результату (функція повертає обчислену суму):

template <class In, class Т>

Т accumulate(In first, In last, T init);

Друга форма алгоритму accumulate дозволяє виконувати над третім параметром і черговим елементом послідовності задану операцію:

template t<class In, class Т, class BinOp>

T accumulate(In first, In last, T init, BinOp binary_op);

У приведеному далі прикладі обчислюється сума, добуток і сума квадратів елементів масиву:

#include <iostream>

#include <numeric>

#include <functional>

using namespace std;

int sumkv( int s, int x){ return s + x * x;}

Void main()

{

const int m = 5;

int a[m] = {3, 2, 5, 1, 6},sum = 0,mul = 1,sum2 = 0;

cout<<accumulate(a, a + m, sum) << endl;

cout<<accumulate(a,a+m,mul,multiplies<int>())<<endl;

cout<<accumulate(a, a + m, sum2, sumkv) << endl;

}

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

17

180

75

Наступний приклад на базі списку (list) демонструє роботу алгоритмів max_element(), accumulate(), а також застосування алгоритму accumulate() для конкатенації рядків.

#include <iostream>

#include <string>

#include <vector>

#include <list>

#include <algorithm>

#include <numeric>

using namespace std;

Void main()

{

int a[5] = {5,1,7,41,2};

list <int> L(a,a+5);

list<int>::iterator ff = L.begin();

for (ff = L.begin();ff != L.end();ff++)

cout <<*ff <<" " ;

L.sort();

cout << "\n\nSort - >";

for (ff = L.begin();ff != L.end();ff++)

cout<<*ff <<" " ;

cout<<"\nmax = " <<*max_element(L.begin(),L.end());

cout<<"\nSumma = " <<accumulate(L.begin(),L.end(),0);

vector<char*> rgs;

rgs.push_back("aaa");

rgs.push_back(" bbb");

rgs.push_back(" ccc");

cout<<"\nConc -> "<<accumulate(rgs.begin(),rgs.end(),

string(" nnn ")) << endl;

}

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

5 1 7 41 2

Sort - >1 2 5 7 41

max = 41

Summa = 56

Conc -> nnn aaa bbb ccc

Алгоритм inner_product.

Перша форма алгоритму inner_product використовується для обчислення скалярного добутку двох послідовностей (скалярним добутком послідовностей а і b є вираз ). Початкове значення добутку задається четвертим параметром. Тип цього параметра визначає тип результату (функція повертає обчислений добуток):

template t<class In1, class In2, class Т>

Т inner_product(Inl first1, Inl last1,

In2 first2, T init);

Друга форма алгоритму inner_product використовується для виконання над двома послідовностями дій, заданих за допомогою двох функцій або функціональних об'єктів. Перший використовується замість операції додавання, другої, – замість множення:

template t<class In1, class In2, class Т,

class BinOp1, class BinOp2>

T inner_product(In1 first1, In1 last1, In2 first2,

T init, BinOp1 binary_op1, BinOp2 binary_op2);

Наступний виклик обчислює добуток сум відповідних елементів послідовностей а і b:

cout << inner__product(a, а + m, b, mu1,

multiplies<int>(), plus<int>());

Алгоритм partial_sum.

Алгоритм partial_sum формує послідовності з часткових сум елементів. Наприклад, для послідовності чисел 3 1 2 3 5 результатом буде 3 4 6 9 14, тобто кожен елемент результату дорівнює попередньому елементу, збільшеному на поточний елемент початкової послідовності.

Замість суми четвертим параметром можна задати іншу операцію. Результат можна помістити і в початкову послідовність, для цього третім параметром вказується ітератор на її початок. Функція повертає ітератор на елемент, наступний за останнім результуючої послідовності.

template t<class In, class Out>

Out partial_sum(In first, In last, Out result);

template t<class In, class Out, class BinOp>

Out partial_sum(In first, In last, Out result,

BinOp binary_op);

Алгоритм adjacent_difference.

Алгоритм adjacent_difference виконує обчислення різниці між суміжними елементами, тобто di = ai – ai-1. Замість різниці четвертим параметром можна задати іншу операцію. Функція повертає ітератор на елемент, наступний за останнім результуючої послідовності.

template t<class In, class Out>

Out adjacent_difference(In first,In last,Out result);

template t<class In, class Out, class BinOp>

Out adjacent_difference(In first,In last,Out result,

BinOp binary_op);

Цей алгоритм є зворотним попередньому, тобто виклик для однієї і тієї ж послідовності спочатку одного, а потім іншого алгоритму приведе до початкової послідовності.