Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекції 2012-2013ооп.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
6.61 Mб
Скачать

8.1. Бібліотека стандартних шаблонів - stl (призначення, основні можливості, сфера застосування).

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

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

Склад STL.

Ядро бібліотеки утворять три елементи: контейнери, алгоритми й ітератори.

Контейнери (containers) - це об' єкти, призначені для зберігання інших елементів. Наприклад, вектор, лінійний список, множина.

Асоціативні контейнери (associative containers) дозволяють за допомогою ключів отримати швидкий доступ до значень, що зберігаються в них.

У кожному класі - контейнері визначений набір функцій для роботи з ними. Наприклад, список містить функції для вставки, видалення й злиття елементів.

Алгоритми (algorithms) виконують операції над умістом контейнера. Існують алгоритми для ініціалізації, сортування, пошуку, заміни вмісту контейнерів. Багато алгоритмів призначені для роботи з послідовністю (sequence), що являє собою лінійний список елементів усередині контейнера.

Ітератори (iterators) - це об' єкти, які стосовно контейнера відіграють роль покажчиків. Сморід дозволяють одержати доступ до вмісту контейнера приблизно так само, як покажчики використовуються для доступу до елементів масиву.

З ітераторами можна працювати так само, як з вказівниками. До них можна застосувати операції *, інкремента, декремента. Типом ітератора оголошується тип iterator, що визначений у різних контейнерах.

Існує п'ять типів ітераторів:

1. Ітератори введення (input_iterator) підтримують операції рівності, разыменования й інкремента.

==i, ++i, i++, *i++

Спеціальним випадком ітератора введення є istream_iterator.

2. Ітератори виведення (output_iterator) підтримують операції разыменования, припустимі тільки з лівої сторони присвоювання, і інкремента.

++++i, i++, *i=t, *i++=t

Спеціальним випадком ітератора виводу є ostream_iterator.

3. Односпрямовані Ітератори (forward_iterator) підтримують всі операції ітераторів уведення/виводу й, крім того, дозволяють без обмеження застосовувати присвоювання.

==i, ++i, i++, *i++

4. Двонаправлені Ітератори (biderectional_iterator) мають всі властивості forward - ітераторів, а також мають додаткову операцію декремента (--i, i--, *i--), що дозволяє їм проходити контейнер в обох напрямках.

5. Ітератори довільного доступу (random_access_iterator) мають всі властивості biderectional - ітераторів, а також підтримують операції порівняння й адресної арифметики, тобто безпосередній доступ по індексі.

i+=n, i+n, i-=n, i - n, i1 - i2, i[n], i1<i2, i1<=i2, i1>i2, i1>=i2

8.2. Стандартні потоки і потокові класи.

Потоки не є характеристикою С++, а були введені ще в ANSI C. У С++ мезанізм потоків оновлено і змінено. Проте загальний механізм під'єднання потоків залишився.

Потік (введенню/виводу) - є абстрактним поняттям, яку відноситься до будь-якого перенесення даних між прибудовами видавання та приймання інформації.

Читання даних з потоку називається операцією витягування даних з потоку (extracting, getting orfetching data). Реалізовується оператором ви-тягуваня з потоку operator>>*. Розміщення даних в потік називаєтться операцією вставки даних в потік (inserting, putting or storing data ). Реалізовується оператором вставки в потік operator<<*.

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

Потоки пов' язані з фізичним пристроєм за допомогою низько- рівневого інтерфейсу введенню/виводу С++. Оскільки усі потоки введенню/виводу (у/в) діють однаково, то система в/в представляє собою єдиний зручний ін -терфейс, незважаючи на ті, що програмісту доводитися працювати з аб-со-лютно різними за природою об' єк -тами. Іншою перевагою потоків є контроль типів, та здатність до розширення, тобто здатність працювати з типами, оголошеними користувачем.

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

За типом пристроів, з якими працюють потоки, їх умовно можна по- ділити на потоки стандартні, файлові і рядковіі. Стандартні потоки ви-користовуються для виведення інформації на еркан та зчитування її з кла- віатури. Файлові потоки забезпечують файловий ввід/вивід. Рядкові потоки використовуються для роботи з масивами символьних рядків в оперативні пам' яті.

Під година вико-нання програми (за умови підмикання основного пото-ко-вого інтерфейсного файлу iostream.h) автоматичний від -кри-ва-ються чотири по-то-ки С++, які вико-ристовуються для зв'язку з прис--троєм по замовчуванню. У таблиці.1 наведено список стан-дартних потоків. У випадку необхідності потоки можуть бути перена- правлені на інші пристрої.

Структура потокової системи введенню/виводу

Потоки С++ повністю реалізовані через класи (ієрархії класів). З метою використання потокових операцій в програмі треба під'єднати хоча б один інтерфейсний файл заголовків ФЗ. Основним серед них є iostream.h. У цьому файлі визначені набори ієрархій класів, які забезпечують ввід та вивід. З іншого боку, підмикання ФЗ fstream.h чи sstream.h* автоматичний підмикає і файл iostream.h, оскільки він для них є базовим.

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

Система потоків С++ базується на двох зв'язаних, проте різних, ієрархіях шаблонів. Деручи з них є ієрархією від базового класу-шаблону base_streambuf. Данії клас (реально екземпляр цього класу streambuf) забезпечує операції в/в нижнього рівня. Верхній рівень забез-пе- чується ієрархією від класу-шаб-лону base_ios. У свою чергу клас-шаблон base_ios є базовим для класів base_istream, base_os - tre - am і base_iostream. Влас-не останні класи-шаблони викорис-товуються для створення кла- сів, які у свою чергу забез-пе-чу-ють ство-рен-ня потоків в/в**. В таблиці.2 наве-дено відповідності класів - шаблонів і породжуваних ними потокових класів.

Потокові класи утворюють дві зв' язані ієрахії класів. На рис.1- 2 наведені ієрархії потокової системи в/у в реалізації Borlаnd C++.

Список потокових класів визначених стан-дартом ISO/ІЕС 1882 наведень у таблиці.3.

У кінцевому результаті користувач отримує дві основні взаємозв'язані ієрархії, що забезпечують систему потокового в/в С++.