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


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


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


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


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


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


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


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


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


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



Контакти
 


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






Параметри шаблонів, що опускаються

Ще однією порівняно новою властивістю шаблонів у мові С++ є можливість опускати параметри шаблонів. Наприклад, визначення шаблона-класу vector y STL має вигляд:

template <class T, class Allocator = allocator >

class vector {

...

};

Для другого параметра цього шаблона (Allocator) визначено значення allocator цього параметра, якщо відповідний йому фактичний параметр шаблона опущений. Усі вміщуючі класи (контейнери) STL використовують засоби управління пам’яттю, які забезпечуються відповідним класом Allocator, а allocator — це тип (визначуваний як клас), котрий забезпечує стандартні засоби управління пам’яттю. Оскільки Allocator має значення, яке опускається, немає потреби щоразу визначати цей параметр при породженні примірника (об’єк­та) класу vector, тобто vector < int > еквівалентне vector < int, allocator >.

8.2.7. Параметричне програмування мовою С++
з використанням стандартної бібліотеки
шаблонів STL

Стандартна бібліотека шаблонів STL (Standard Template Library) забезпечує можливість параметричного програмування мовою С++. Вона включає в останню попередню версію (Draft) стандарту мови С++. Тут міститься короткий огляд бібліотеки та приклади використання її компонентів.

Файли — заголовки STL.

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

1. Вміщуючий клас (контейнер) STL з ім’ям с міститься у файлі < c.h >; наприклад, vector у файлі < vector.h >, list у файлі < list.h > і т. д.

2. Адаптери вміщуючих класів(контейнерів) STL(stack, queue та priority_queue) містяться у файлі <stack.h>.

3. Усі параметричні алгоритми STL містяться у файлі <algo.h>.

4. Ітераторні класи та адаптори ітераторів STL містяться у файлі <iterator.h>.

5. Об’єкти функції та адаптори функції STL містяться у файлі <function.h>.

Усі основні деталі та більша частина менш важливих деталей ілюструється прикладами, які розроблені в такий спосіб, щоб їх можна було читати й розуміти візуально, не виконуючи на комп’ютері. Однак більшість прикладів допускає компіляцію та виконання з різними установками фактичних параметрів, дозволяє повільніше демонструвати можливості STL. Щоб приклади були зрозуміліші, у них широко застосовується стандартний макрос С/C++assert (див. файл-заголовок assert.h). Цей макрос розглядає вираз із бульовим значенням, переданим йому як аргумент, та нічого не робить, якщо значення вказаного виразу є true. Якщо ж це значення дорівнює false, то макрос друку друкує повідомлення та завершує програму. Спочатку розглянемо приклад, в якому взагалі не використовується STL.

Приклад 8.1. Застосування макрос assert.

#include <iostream.h>

#include <assert.h>

#include <string.h>

int main ()

{

cout<<«Illustrating the Assert macro.»<< end1;

char* string0 = mark twain;

char string1[20];

char string2[20];

strcpy(string1, string0);

strcpy(string2, string0);

int N1 = strlen(string1);

int N2 = strlen(string2);

assert (N1==N2);

//put the reverge of string1 in string2:

for(int k=0; k!=N1; ++k)

string2[k]= string1[N1-1-k];

assert(strcmp(string2, «niawt kram») == 0);

};

У цьому прикладі при першому використанні assert перевіряється, що довжини сторін string1 та string2 однакові. Друге використання assert перевіряє, що рядок string2 містить послідовність символів «niawt kram».

Якщо у програмі є помилка — або в обчисленнях, або в операторах assert, — виконання програми припиняється і друкується відповідне повідомлення. Наприклад, у програмі помилково було надруковано:

for (int k=0; k!=N1; ++k)

string2[k]= string1[N1-k];

(помилка в індексі масиву: замість правильного string1 [N1-1-k] надруковано string1 [N1-k], у цьому разі виконання програми приведе до такого друку:

Illustrating the аssert macro.

Assertion failed: assert(strcmp(string2, «niawt kram») == 0),

file: c:\st1\examples\ex01-01a.cpp, line 24

Такий самий текст буде і в разі помилки в assert, наприклад, якщо у програмі буде написано:

for(int k=0; k!=N1; ++k)

string2[k]= string1[N1-1-k];

assert(strcmp(string2, «naiwt kram») == 0);

(помилка полягає в тому, що замість правильного «niawt» написано «naiwt». Звичайно, можливі й інші помилки, які можуть бути виявлені за допомогою assert.

Приклад використання макросу assert разом із STL

STL дозволяє параметризувати програму, оскільки STL містить параметричний алгоритм reverse, який дає змогу діставати дзеркальне відображення багатьох видів послідовностей, у тому числі — рядків символів. Розглянемо приклад:

#include < iostream.h >

#include < algo.h > // містить алгоритм reverse

#include < assert.h >

#include < string.h >

int main ()

{

cout<<«Using reverse algorithm with an array.«<< end1;

char* string1 = «mark twain»;

int N1 = strlen(string1);

reverse(string1, string1+N1);

assert(strcmp(string1, «niawt kram») == 0);

};

Параметрами reverse є покажчики початку та кінця рядка (кінцем рядка є перша позиція після останнього символа рядка). Функція забезпечує відображення рядка в самій собі.




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

<== попередня сторінка | наступна сторінка ==>
Шаблони, шаблони-класи | Приклади, які використовують вектори символів

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

 

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


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