Оголошення функцій шаблону

template <class T>

void F(Array<T>&);

 

Функція F приймає параметром масив з елементами параметричного типу. При виклику фукнції значення T конкретизується.

 

F(Array <int> &);

 

Функція F приймає параметром цілочисельний масив. При оголошенні функції шаблонів список параметрів може включати як об'єкти, що задані в параметричній формі, так і екземпляри шаблонів.

 

void F(Arry <T>&, Array<int>&);

 

Перший масив може бути масивом будь-яких об'єктів, а другий тільки масивом цілих чисел. Функції шаблонів використовуються при написанні узагальнених алгоритмів, які можна застосовувати до різних типів даних. Наприклад алгоритми сортування, пошуку, підрахунку та ін.

 

Спеціалізація

За замовчуванням шаблон дає єдине визначення, яке має використовуватись для всіх аргументів шаблону. Альтернативне визначення шаблону дозволяє компілятору зробити вибір потрібного варіанту на основі аргументів шаблону. Такі альтернативні визначення називаються спеціалізаціями.

 

temlate <class T>

class Vectot{...};

Vector <int> vi;

Vectot <Cat> vCat;

Vectot <char*> vpc;

 

Оголошений шаблон вектора загального типу. Спеціалізаціями є vi - вектор цілих, vCat - вектор об'єктів типу Cat, vpc - вектор вказівників на символ. В більшості реалізацій C++ код функції шаблону дублюється. Це позитивно впливає на продуктивність, але призводить до збільшення коду. Спеціалізація дозволяє уникнути негативних наслідків, при цьому використовується загальний інтерфейс.

 

Шаблони та дружні функції

Класи шаблона можуть оголошувати 3 типи дружніх відносин:

- дружній клас або функція що не є шаблонними

- дружній шаблон класу, або функція, що входить в шаблон

- дружній шаблон класу, або шаблонна функція певного типу даних

 

Аргументи шаблону необхідно використовувати для вибору алгоритму. Якщо для функції шаблону необхідна різна поведінка, в залежності від фактичного типу, то функцію шаблону можна перевизначити для конкретного типу даних. Рекомендація: використовувати шаблони, коли поведінка класу незмінна і залежить тільки від типу елемента з яким працює клас.

 

Стандартна бібліотека шаблонів (STL)

Це бібліотека класів-контейнерів, що базуються на шаблонах. Вона включає: вектори, списки, черги, стеки та ряд узагальнених алгоритмів (сортування та пошуку). Бібліотеку STL можна багаторазово використовувати для розробки власних програм

 

Контейнери

Контейнер - це об'єкт, який включає інші об'єкти. Розрізняють 2 типи контейнерів бібліотеки STR:

- послідовні контейнери

- асоціативні контейнери

 

Послідовні контейнери

Вони забезпечують послідовний, або довільний доступ до своїх членів та елементів.

Види послідовних контейнерів:

- вектор

- спики

- черги

- стек

 

Для під'єднання контейнера необхідно записати

 

#include <ім'я контейнера>

using namespace std

 

Всі контейнери працюють в просторі імен std

 

Контейнер-вектор

Це контейнер для швидкого доступу до елементів за індексами. Оголошення контейнера

 

temlate <class T, class A = allocator<T>> class Vector{...};

 

Аргумент class T означає тип елементів вектора. Аргумент class А це клас розподілу, що виконує функції диспетчера пам'яті. Використання контейнера визначає тип елементів

 

Vector <int> vint; - вектор цілих чисел

 

Функції контейнерів

.size() - повертає к-сть елементів вектора

.empty() - повертає TRUE якщо векто пустий

.push_back() - додає один елемент в кінець вектора

.front() - повертає посилання на перший елемент у векторі

.back() - повертає посилання на останній елемент вектора

.insert() - вставляє один або декілька елементів в поточну позицію вектора

.pop_back() - видаляє з вектора останній елемент

.remove() - переміща з вектора один або декілька елементів

 

Контейнер-список

Список це контейнер, що призначений для виконання частих вставок та видалень елементів. Контейнер визначений в файлі заголовку <List> в просторі імен STD. Клас список реалізований як двонаправлений зв'язаний список в якому кожний блок включає вказівник на попередній та вказівник на наступний блок. Контейнер List включає всі функції контейнера вектор. Перехід на конкретний елемент списку вібдувається за допомого ітератора(узагальнений вказівник)

 

typedef List<int> iList;

{...}

void main(){

iList intList;

...

} //оголошення об'єкту списку цілих чисел

 

Двостороння черга

Подібна до двостороннього вектора та наслідує його функції послідовного зчитування та запису.

 

<deque>

 

включає оптимізоване додавання та видаленя елементів з обох кінців черги.

Спорідненим класом двосторонньої черги, є клас Черги, який реалізований, як клас оболонки контейнера. <queue> і підтримує функції front(), back(), push_back(), pop_back(). Черга відноситься до структури типу FIFO - перший прийшов - перший вийшов.

 

Контейнер стек

Ралізований в файлі заголовку <stack> в просторі імен STD. Це непервний блок виділеної памяті, який розширюється або скорочується з однієї сторони. Для реалізації стеку можна використовувати будь-який послідовний контейнер, який підтримує функції back(), push_back(), pop_back(). Це структура типу LIFO - останінй прийшов - перший пішов. Клас шаблону stack може включати елементи будь-якого типу, але всі елементи мають бути однакового тику.

 

Асоціативні контейнери

Розроблені для швидкого доступу до даних з допомогою ключів

Map – коже елемент карти складається з двох полів: ключа і значення. Ключ має бути унікальним, ніякі два елементи не можуть мати однаковий ключ. Значенням елементу може бути об’єкт будь-якого типу. Для додавання елемента у карту використовується функція push_back() та insert().

Multimap – клас карт, який не обмежується унікальністю ключа. Тобто два і більше елементів можуть мати однакові ключі

 

Set – (набір або множина) елементи множити включають тільки ключі. Для визначення належності елемента множині встановлюють ряд правил

 

Multiset – це клас множини, який дозволяє включати декілька значень ключа.

 

Контейнер класу алгоритм-

 

Всі стандартні контейнери включають елементи контейнера та методи керування контейнерами. Оскільки більшість цих методів однакові для різних контейнерів, вони формують контейнер алгоритмів, як набір узагальнених алгоритмів. Такі алгоритми допомагають полегшити програмісту створення власних методів при розробці нових контейнерів. Бібліотека STL включає близько 60 стандартних алгоритмів, які визначені у файлі algorithm простору імен std.