Студопедия
Новини освіти і науки:
МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах


РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання


ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ"


ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ


Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків


Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні


Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах


Гендерна антидискримінаційна експертиза може зробити нас моральними рабами


ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ


ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів



Контакти
 


Тлумачний словник
Авто
Автоматизація
Архітектура
Астрономія
Аудит
Біологія
Будівництво
Бухгалтерія
Винахідництво
Виробництво
Військова справа
Генетика
Географія
Геологія
Господарство
Держава
Дім
Екологія
Економетрика
Економіка
Електроніка
Журналістика та ЗМІ
Зв'язок
Іноземні мови
Інформатика
Історія
Комп'ютери
Креслення
Кулінарія
Культура
Лексикологія
Література
Логіка
Маркетинг
Математика
Машинобудування
Медицина
Менеджмент
Метали і Зварювання
Механіка
Мистецтво
Музика
Населення
Освіта
Охорона безпеки життя
Охорона Праці
Педагогіка
Політика
Право
Програмування
Промисловість
Психологія
Радіо
Регилия
Соціологія
Спорт
Стандартизація
Технології
Торгівля
Туризм
Фізика
Фізіологія
Філософія
Фінанси
Хімія
Юриспунденкция






Адаптери

Компонент, який модифікує інтерфейс іншого компонента, називається адаптером. Прикладом адаптера є компонент reverse-iterator (обернений ітератор), що перетворює тип ітератора на новий тип ітератора, який має ці властивості початкового типу, але здійснює обхід послідовності у протилежному напрямі. Це корисно, оскільки іноді стандартний порядок обходу може виявитись неприпустимим чи незручним для конкретної прикладної програми. Наприклад, параметричний алгоритм find визначає значення ітератора, який відповідає першому входженню шуканого значення у послідовність, а програмі може бути потрібне останнє входження. Використання оберненого ітератора дозволяє робити це, не порушуючи і не копіюючи послідовності.

Продовжимо розгляд прикладу з параметричною функцією accumu­late. Коли послідовність містить у собі цілі значення, немає сенсу змінювати порядок її обходу при підсумовуванні значень її елементів, додавання цілих значень комутативне та асоціативне (а втім, властивість асоціативності порушується при переповненнях), і результат не залежить від порядку підсумовування. Але властивості комутативності та асоціативності не зберігаються для значень з плаваючою крапкою (float чи double) через помилки округлення, зрівнювання порядків та переповнення. Відомо, що помилки округлення нагромаджуються менше, коли послідовність чисел підсумовується в порядку зростання їх значень. Адже у противному разі значення, дуже малі порівняно з іншими, можуть зовсім не ввійти до суми (зрівнювання порядків).

Нехай задано вектор, значення елементів якого розміщені у спадному порядку і нехай потрібно обчислити суму значень елементів цього вектора. Для розв’язання цієї задачі природно застосувати параметричну функцію accumulate з оберненим ітератором.

#include <vector.h>

#include <algo.h>

#include <assert.h>

int main()

{

cout<<«Параметрична функція accumulate з оберненим»

<<«ітератором.»<< end1;

float small = (float)1.0/(1 << 26);

float x[5] = {1.0, 3*small, 2*small, small, small};

//ініціалізація вектора vector1 значенням від x[0] до x[4]

vector<float> vector1(&x[0],&x[5]);

cout <<«Значення, які треба додати.»<< end1;

vector<float>::iterator i;

cout.precision(10);

for(i = vector1.begin();i! = vector1.end(); i++)

cout << *i << end1;

cout << end1;

float sum = accumulate(vector1.begin(),vector1.end()

(float)0.0);

cout<<"Сума, яка обчислюється зліва-направо ="<<sum<<end1;

float sum1 = accumulate(vector1.rbegin(),vector1.rend()

(float)0.0);

cout<<"Сума, яка обчислюється справа-наліво = "<<sum1<<end1;

}

При обчисленні sum1 застосовуються функції-члени rbegin () та rend()класу vector, щоб використати інтератор типу vector <float> :: reverse-iterator, котрий, як і вектор vector < float > :: iterator, є частиною інтерфейсу класу vector. Значення small було дібрано так, щоб sum та sum1 мали різні значення. При виконанні програми на екран буде виведена така інформація.

Параметрична функція accumulate з оберненим ітератором.

Значення, які треба додати.

4,470348358е-08

2,980232239е-08

1,490116119е-08

1,490116119е-08

Сума, яка обчислюється зліва-направо = 1

Сума, яка обчислюється справа-наліво = 1,000000119

Тип вектор vector<float>::reverse-iterator визначений за допомогою адаптера. Цей адаптер можна було б безпосередньо використовувати у програмі, записавши:

Reverse-iterator<vector<float>::iterator, float, float&,

ptrdiff – t>

first(vector.end()),last(vector.begin());

float sum1 = accumulate(first, last,(float)0.0);

Тут first та last оголошені як змінні типу

reverse_interator<vector<float>::interator, float, float&,

ptrdiff_t>

в якому перший параметр шаблона vector<float>: :iterator, задає тип ітератора, а другий, float, — тип відповідних значень; третій параметр, float& , є типом покажчика на тип значень, четвертий параметр, ptrdiff – t, — задає крок між двома послідовними значеннями ітератора. Так само як і vector<float>::iterator, ітератор vector <float>:: reverse-iterator підтримує операції ++ та -- , але вони мають протилежний зміст. Усі контейнерні типи STL забезпечують вже визначений в них, зв’язаний з функціями-членами rbegin () та rend().

У STL, крім оберненого ітератора визначені й інші адаптери.




Переглядів: 291

<== попередня сторінка | наступна сторінка ==>
Об’єкти-функції | Алокатори

Не знайшли потрібну інформацію? Скористайтесь пошуком google:

 

© studopedia.com.ua При використанні або копіюванні матеріалів пряме посилання на сайт обов'язкове.


Генерація сторінки за: 0.004 сек.