Приклад рішення задачі
Див. проект «Task17».
Контрольні питання
Що мають на увазі, коли говорять про сортування колекції об’єктів?
Наведіть приклади коли необхідне впорядковування послідовності об’єктів.
Охарактеризуйте різні алгоритми сортування.
Дайте рекомендації щодо прискорення процесу сортування.
Наведіть приклади зручного угрупування послідовності об’єктів.
Дайте рекомендації щодо реалізації універсальних алгоритмів обробки контейнерів.
Що таке компаратор?
Як реалізувати і використовувати компаратор у вигляді зовнішньої функції?
Як реалізувати і використовувати компаратор у вигляді внутрішньої функції?
Як використовують ітератори?
18 Узагальнення – шаблони класів, шаблони функцій. Бібліотека шаблонів
Лабораторна робота №18
Мета: продемонструвати використання в програмах на С++ родових класів і шаблонів сімейства функцій.
Індивідуальні завдання
При розробці проекту використовувати раніше обрану прикладну область та реалізовану функціональність. Створити клас, що забезпечує представлення Об’єкта 5. Створити методи, які забезпечують обробку колекції екземплярів Об’єктів 5. Забезпечити збереження колекції у файлі та відновлення її з файла. Запропонувати варіант реалізації класу-контейнера з використанням шаблонів.
Термінологія
Шаблон (template) – механізм параметризації класу або функції довільним типом. Шаблони дозволяють застосовувати механізм введення загальних концепцій та методів їх спільного використання. Із шаблону класу у разі задавання конкретного значення параметра утворюється звичайний клас, тому шаблон класу називають генератором типів або родовим класом.
Шаблони як засіб мови C++ призначені для кодування узагальнених алгоритмів, без прив’язки до деяких параметрів: типу даних, розміру буфера та стандартного значення. В C++ можливе створення шаблону функції і шаблону класу. Використання шаблонів не скорочує виконаний код, тому що для кожного набору параметрів компілятор створює окремий екземпляр функції або класу.
Процес генерації спеціалізованого класу чи функції за шаблоном та аргументом шаблону називають інстанціюванням.
Коли виконується генерація різних версій шаблону для різних значень параметра, кожну з цих версій називають спеціалізацією.
У заголовку шаблону імена параметрів шаблону повинні бути унікальні. Параметрами шаблонів можуть бути: параметри-типи, параметри звичайних типів, параметри-шаблони. Для параметрів будь-якого типу можна вказувати значення за замовчуванням, синтаксис та правила використання аналогічні з аргументами функцій за замовчуванням. Одна спеціалізація вважається більш спеціалізованою за іншу, якщо список аргументів першої спеціалізації відповідає другій, а не навпаки. В процесі генерації типів перевагу віддають більш спеціалізованим версіям.
Шаблони можна ефективно використовувати для успадкування. Методику абстракції за допомогою шаблонів називають параметричним поліморфізмом або поліморфізмом часу компіляції на відміну від поліморфізму часу виконання, що забезпечується віртуальними функціями.
При створенні функцій іноді виникають ситуації, коли дві функції виконують однакову обробку, але працюють з різними типами даних (наприклад, одна використовує параметри типу int, а інша типу float або double). За допомогою механізму перевантаження функцій можна використовувати одне й те ж ім’я для функцій, що виконують різні дії і мають різні типи параметрів. Однак, якщо функції повертають значення різних типів, слід використовувати для них унікальні імена. Шаблонна функція дає можливість повертати значення різних типів, що значно полегшує роботу і зменшує кількість змінних у коді.
Шаблони розміщують в файлах, що включаються (заголовних).
Стандартна бібліотека шаблонів (Standard Template Library; STL) – бібліотека для C++, що містить набір узагальнених алгоритмів, контейнерів, засобів доступу до їхнього вмісту і різних допоміжних функцій.
У бібліотеці виділяють п’ять основних компонентів:
контейнер (container) – зберігання набору об’єктів в пам’яті; розділяють на чотири категорії: послідовні, асоціативні, контейнери-адаптери і псевдоконтейнери; використовується семантика передачі об’єктів за значенням;
ітератор (iterator) – забезпечення засобів послідовного доступу до вмісту контейнера; кожен контейнер підтримує свій вид ітератора, який є інтелектуальним вказівником, що «знає» як отримати доступ до елементів конкретного контейнера
алгоритм (algorithm) – визначення обчислювальної процедури;
адаптер (adaptor) – адаптація компонентів для забезпечення різного інтерфейсу;
функціональний об’єкт (functor) – заховання функції в об’єкті для використання іншими компонентами.
Розділення дозволяє зменшити кількість компонентів. Наприклад, замість написання окремої функції пошуку елементу для кожного типу контейнера забезпечується єдина версія, яка працює з кожним з них, поки дотримуються основні вимоги.
Do'stlaringiz bilan baham: |