Бібліотека стандартних шаблонів

Borland CBuilder включає в себе, як ми зазначали вище, повний компілятор стандарту ANSI C + + Одним з нових вимог до будь-якого компілятору C + +, накладених комітетом ANSI C + +, є вимога поставки компілятора з реалізацією стандартної бібліотеки Це потрібно для спрощення перенесення так званого стерпного коду (portable code), наприклад, допоміжних функцій і функцій роботи з базами даних, на інший компілятор (іншу платформу) Ця зміна – одне з найважливіших відносно руху C + + до справжньої переносимості між компіляторами, операційними системами і платформами

Частиною стандартної бібліотеки C + + є бібліотека стандартних шаблонів (Standard Template Library, STL), яка містить загальні класи, необхідні майже у всіх розроблюваних програмах і системах CBuilder включає повну реалізацію бібліотеки Rogue Wave Tools STL, яка містить класи для рядків, контейнерів та інших витончених речей У цьому розділі ми починаємо дослідження STL, спочатку поза графічної середовища CBuilder, а потім як додаток до розробки додатків, заснованих на формах

STL – побудована на шаблонах бібліотека допоміжних класів У ній немає ні графіки, ні компонентів, ні чогось подібного Бібліотека служить для створення максимальної зручності роботи з будь-якими даними будь-яким способом Бібліотека STL надає стерпний клас string (рядок), який дозволяє забути про проблеми переповнення рядків у символьних масивах, виділення частин рядка та інших проблемах, повязаних з рядками Клас string широко розповсюджений у середовищі CBuilder, так що вам варто подумати про його (або подібного йому класу AnsiString, який сумісний з VCL) використанні замість символьних масивів для подання рядків у ваших додатках

Клас STL string і повязана з ним функціональність є достатніми причинами, щоб використовувати його у ваших додатках або як мінімум вивчити його, але клас string є тільки невеликою частинкою мощі STL На додаток до рядків, STL також надає повну реалізацію масивів (які на жаргоні STL називаються векторами, vectors), повязаних списків (і одно-, і двонапрямлених), черг (Queues), таблиць (maps, щось типу словника) та інших стандартних структур даних

Всі класи STL представляють із себе шаблони Якщо ви деякий час працювали з C + +, то ви певно знаєте, що шаблони – це дуже розумні макроси, з якими умет працювати компілятор Щоб зрозуміти, що таке шаблони, уявіть собі таку ситуацію У вас є клас масив (array), який зберігає цілі числа Він знає, як виділити память під ціле, зберегти його в памяті, отримати його з памяті за індексом в масиві і знайти задане ціле в масиві Цей клас чудово підходить для зберігання ваших цілих чисел і ви використовуєте його деякий час, але тепер вам потрібно крім цілих зберігати ще й речові числа з плаваючою крапкою У вас є два варіанти По-перше, ви можете скопіювати початковий клас для масиву цілих і замінити в ньому всі ключові слова int (ціле) на double (Речовий з подвійною точністю) Або ви можете розробити якусь фантастичну систему, яка буде перетворювати речові в цілі, втрачаючи при цьому всю їх точність (чим, я впевнений, нечувано порадуєте банківських службовців)

Замість хворобливого клонування всього класу для нового типу даних, чи не простіше було б якби можна було змусити компілятор підставляти ключове слово double усюди, де у вашому класі зустрінеться int Ну, може бути, не всюди – і ось у цьому основна перешкода Давайте подивимося на опис класу (частина нашого міфічного класу масив цілих):

class IntegerArray

{

int *pArrayOfInts int nNumberOfInts public:

IntegerArray (int nNumberOfInts)

~IntegerArray(void)

void Add (int nIntToAdd )

void Remove (int nIntToRemove) int Find (int nIntToFind) / / Повернення:

/ / Індекс знайденого числа

int GetAt (int nIndex )

void SetAt  (int nIndex, int nIntegerToAdd)

}

Тепер, припустимо, вам потрібно зберігати масив дійсних чисел з плаваючою точкою (floating-point) Ви, ймовірно, просто скопіювали б попередній заголовок і змінили його так, щоб підтримувати речові числа (подвійної точності, double) У цьому випадку у вас, ймовірно, вийшов би ще блок коду, типу такого:

class DoubleArray

{

double *pArrayOfDoubles int nNumberOfDoubles public:

DoubleArray (int nNumberOfDoubles)

~DoubleArray(void)

void Add (double dDoubleToAdd )

void Remove (double dDoubleToRemove )

int Find (double dDoubleToFind) / / Повернення: індекс

/ / Знайденого числа

int GetAt (int nIndex )

void SetAt (int nIndex, double dDoubleToAdd)

}

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

Не було б краще, якби ми могли написати клас один раз і потім всі інші класи генерувалися з якої-небудь базової копії Коли ви робите копію автомобіля або ще чого-небудь, то базова конструкція часто називається шаблоном (template) Так що це відповідний термін для базового класу, який містить інструкції, що дозволяють конструювати різні класи на його основі У попередньому прикладі ми б тоді створили один клас, званий Array (масив), який би працював з одним параметром (параметром шаблону), який представляє з себе тип даних, з яким ми хочемо працювати Тоді ми б написали шаблонний клас так:

template &ltclass _Type&gt class Array

{

_Type *pArrayOfType int nNuberOfType public:

Array (int nNumberOfType)

~Array (void)

void Add (_Type tTypeObject ) void Remove (_Type tTypeObject )

int Find (_Type tTypeObject) / / Повертає номер

/ / Знайденого обєкта

_Type GetAt (int nIndex )

void SetAt (int nIndex, _Type tTypeObject)

}

Коли вам захотілося б створити новий клас, який використовує цей як шаблон, то ви використовували б аргумент, як при виклику функції Наприклад, для створення масиву цілих, ви б написали:

Для масиву дійсних чисел це виглядало б так:

І, нарешті, масив деякого довільного типу (наприклад, класу string) виглядав би так:

Щось такого типу було б чудово, чи не так Ймовірно, вам ніколи б не знадобилося писати інший клас Array Ну, це в точності і є функціональність, що надається STL Ця бібліотека містить шаблонні версії всіх стандартних структур даних, потрібних більшості додатків Для використання масиву цілих, наприклад, вам потрібно використовувати клас vector Для створення таблички, зіставляти рядку ціле, використовується клас map і так далі

Весь цей згенерований код, звичайно, є хорошим стимулом для використання STL, але є більш переконливі аргументи Коли ви пишете допоміжний код, наприклад управління файлами, або базами даних, або просто класи для бізнес-додатки, ви частенько знайдете, що вам потрібно підтримувати різні платформи Код повинен працювати в Windows 95 під C + + Builder, також необхідно використовувати обєкти в керуючих елементах ActiveX для Internet і Unix-додатків Якщо ви будете використовувати власні структури даних, такі як в OWL або MFC, то вам дуже не поталанить якщо вам доведеться переходити на інші компілятори або операційні системи Використовуючи бібліотеку STL, яка доступна в исходниках (безкоштовно) від компанії Hewlett Packard (звідки і пішла бібліотека STL), ви можете бути впевнені, що цей код буде працювати на всіх платформах, які вам потрібні Процедура, яку ви написали для свого улюбленого Amiga 2000 (так, у мене дійсно такий є, і так, він все ще працює), буде працювати в незмінному вигляді на Pentium II, який ви вчора купили Якщо це недостатньо потужний стимул для використання STL, то візьміть до уваги наступне Компанія Borland була так вражена міццю і гнучкістю STL, що вона не надає ніяких інших компонентів в VCL для обробки масивів, повязаних списків і тд Ви можете використовувати STL безпосередньо в компонентах VCL Коротше, не існує причин, чому б не використовувати бібліотеку шаблонів STL в ваших додатках

Джерело: Теллес М – Borland C + + Builder Бібліотека програміста – 1998

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*