рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Контейнери

Контейнери - Конспект, раздел Образование, Конспект лекцій СИСТЕМНЕ ПРОГРАМУВАННЯ Перед Тим, Як Дати Загальне Визначення Контейнера, Спочатку Як Приклад Сконст...

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

Ми можемо узагальнити стек символів до стека елементів будь-якого типу, оголосивши його як шаблон і замінивши конкретний тип char на параметр шаблону. Наприклад:

 

template<class T> class stack

{

T* v;

int max_size;

int top;

public:

class Underflow {};

class Overflow {};

class Bad_pop {};

stack(int s);

~ stack();

void push(T);

T pop();

};

 

Функції-члени можна визначити таким чином:

 

template<class T> void stack<T>::push(T c)

{

if (top = = max_size) throw Overflow();

v[top]= c;

top = top + 1;

}

template<class T> T stack<T>::pop()

{

if (top = = 0) throw Underflow();

top = top - 1;

return v[top];

}

 

Після цього стек можна використовувати таким чином:

 

stack<char> sc(200); // стек для 200 символів

stack<complex> scplx(30); // стек для 30 комплексних чисел

stack<list<int>> sli(45); // стек для 45 списків цілих чисел

void f()

{

sc.push(‘c’);

if (sc.pop() != ‘c’) throw Bad_pop();

scplx.push (complex(1,2));

if (scplx.pop() != complex(1,2)) throw Bad_pop();

}

 

Як шаблони можна визначити списки, вектори і т. д.

Клас, об'єкти якого можуть містити в собі набір елементів деякого типу, називають класом-контейнером або просто контейнером.

Стандартна бібліотека шаблонів STL надає найзагальніші й найкорисніші типи контейнерів. Основні| з них перелічені в табл. 8.2

 

Таблиця 8.2

Основні| контейнери бібліотеки STL

Контейнер Призначення
vector<T> list<T> queue<T> stack<T> deque<T> prioryity_queue<T> set<T> multiset<T>   map<Key, val> multimap<Key, val> Вектор змінного розміру елементів типу <T> Двозвязковий список Черга Стек Черга з двома кінцями Пріоритетна черга Множина Множина, в якій одне значення може зустрічатися кілька разів Асоціативний масив Асоціативний масив, в якому ключ (Key) може зустрічатися кілька разів.

8.4.2 Послідовності та ітератори

У стандартній бібліотеці С++ STL визначене поняття послідовності елементів і є механізм маніпулювання послідовностями за допомогою ітераторів.

Графічне представлення послідовності показано на мал. 8.1

 

Малюнок 8.1 Графічне представлення послідовності з бібліотеки STL

 

Послідовність має початок і кінець. Ітератор посилається на поточний елемент і надає операцію, що примушує його посилатися на наступний елемент послідовності. Кінцем послідовності є ітератор, що посилається на елемент, наступний за останнім елементом послідовності.

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

Для доступу до поточного елементу послідовності через ітератор в мові С++ використовується оператор розіменування| * (dereference), а оператор збільшення ++ використовується для того, щоб примусити ітератор посилатися на наступний елемент.

8.4.3 Узагальнені алгоритми

Щоб продемонструвати роботу узагальненого алгоритму, спочатку напишемо наступний код:

 

template<class In, class Out> void copy(In from, In too_far, Out to)

{

while (from != too_far)

{

*to = *from; // копіювання елементу, на який

// указує ітератор

++to; // перехід на наступний елемент контейнера

// у який іде копіювання

++from; // перехід на наступний елемент контейнера

// з якого йде копіювання

}

}

 

Приведений фрагмент копіює будь-який контейнер, для якого визначені ітератори. Вбудовані в С++ типи, такі як вказівники й масиви, мають відповідні операції, тому можна написати:

 

char vc1[200];

char vc2[500];

void f()

{

copy(&vc1[0] &vc1[200], &vc2[0]);

}

 

Всі контейнери стандартної бібліотеки С++ підтримують техніку ітераторів і послідовностей.

Два параметри шаблону In і Out використовуються для завдання типів джерела і приймача, оскільки вони можуть бути різними. Наприклад:

 

complex ас[200];

void g(vector<complex>&vc, list<complex>&lc)

{

copy(&ас[0] &ac[200], lc.begin());

copy(lc.begin(), lc.end(), vc.begin());

}

 

Ця функціякопіює масив у список і список у вектор. В стандартному контейнері begin() – це ітератор, що вказує на його перший елемент, end() – на елемент, наступний за останнім елементом.

У табл. 8.3 перелічені основні| узагальнені алгоритми бібліотеки STL.

 

Таблиця 8.3

Основні| узагальнені алгоритми бібліотеки STL

Функція Опис
for_each()     find()   find_if()   count()   replace() replace_if()   copy() unique_copy() sort() merge() Викликає функцію, задану як третій аргумент, для кожного елементу послідовності; має наступний список аргументів: sh.begin(), sh.end(), fun(…) Знаходить у послідовності перше входження аргументу Знаходить у послідовності першу відповідність предикату Підраховує число входжень елементу в послідовність Замінює елемент послідовності новим значенням Замінює елемент послідовності, відповідний предикату, новим значенням Копіює елементи послідовностей Копіює тільки різні елементи послідовностей Сортує елементи послідовностей Зливає відсортовані послідовності

 

Часто доводиться працювати з контейнером вказівників і бажано викликати функції-члени об'єктів, на які вони посилаються, а не функції над вказівниками. Наприклад, нам може знадобитися викликати функцію-член| shape::draw() для кожного елементу списку list<shape*>. Для вирішення цього завдання можна написати функцію – не член класу, яка викликатиме функцію-член| класу. Наприклад:

 

void draw(shape* p)

{

p->draw();

}

void f(list<shape*>&sh)

{

for_each(sh.begin(), sh.end(), draw);

}

 

або натомість:

 

void g(list<shape*> &sh)

{

for_each(sh.begin(), sh.end(), mem_fun(&shape::draw));

}

 

Стандартний бібліотечний шаблон mem_fun() приймає як аргумент вказівник на функцію-член і повертає те, що виробляє ця функція.

Механізм mem_fun() важливий, оскільки дозволяє використовувати стандартні алгоритми для контейнерів з поліморфними об'єктами.

9 СИСТЕМА ВВОДУ-ВИВОДУ МОВИ C++

Система вводу - виводу мови C++ так само, як і система вводу - виводу мови C, діє через потоки вводу – виводу.

Потік вводу - виводу — це логічний пристрій, який видає і приймає призначену для користувача інформацію. Потоки вводу – виводу (streams) мови C++ не слід плутати з потоками інструкцій програми (threads), паралельно виконуваними операційною системою.

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

Наприклад, функція, яка використовується для запису інформації на екран комп'ютера, цілком підійде як для запису інформації у файл на диску, так і для виводу її на принтер.

– Конец работы –

Эта тема принадлежит разделу:

Конспект лекцій СИСТЕМНЕ ПРОГРАМУВАННЯ

Конспект лекцій... по дисциплiні СИСТЕМНЕ ПРОГРАМУВАННЯ...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Контейнери

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

РОБОТА З ДАНИМИ
Якість організації і представлення даних, що обробляються програмами, має не менше значення, ніж хороше розбиття програм на функції, обробляючі ці дані, та реалізація алгоритмів цих функцій. Більш

Оголошення
В мові С++ кожне ім'я (ідентифікатор) слід оголосити перш, ніж воно буде використовуватися в програмі. Це означає, що потрібно вказати його тип, щоб компілятор знав, до якого виду об'єктів має відн

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

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

Типи даних користувача
Описані раніше вбудовані типи даних мови C++ можуть бути доповнені новими типами даних, визначеними самим користувачем. Типи даних користувача діляться на три групи: переліки, структури й об'єднанн

Структури мови C
Масив є сукупністю елементів одного типу, а структура є сукупністю елементів різних типів. Оголошення структури має наступний формат:   struct struct_name {

Оголошення typedef
Оголошення, що починається з ключового слова typedef, вводить нове ім'я (синонім) для типу, а не оголошує нову змінну цього типу. Формат оголошення typedef наступний:   typed

Масиви як аргументи
Якщо в якості аргументу функції задається масив, то передається вказівник на його перший елемент. Наприклад:   int strlen(const char*); void f() {

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

Макрос WINAPI
Оскільки компілятор Visual C++ більше не підтримує ключових слів __pascal, __fortran та __syscall, їх дію рекомендується емулювати за допомогою описаних вище ключових слів __cdecl, __stdcall або __

ПРОГРАМУВАННЯ ВИКЛЮЧЕНЬ
Виключною ситуацією, або виключенням (exception), називається переривання нормального потоку виконання програми у відповідь на непередбачену або аварійну подію. Події, що приводять до викл

Виключення Win32
Разом з програмними викликами виключень за допомогою інструкції throw, виключення генеруються системними програмами Win32 API у відповідь на збій апаратного або програмного забезпечення. Такі виклю

Обробка виключень Win32
Існує декілька способів обробки виключень Win32. Найбільш простий з них полягає в використанні блоку catch з трьома крапками:   try { // … // генер

МОДУЛЬНЕ ПРОГРАМУВАННЯ
Набір зв'язаних процедур разом з даними, які вони обробляють, називається модулем. Модуль – програмний фрагмент, який є будівельним блоком для побудови великих програм. Як правило, модуль складаєть

Директиви препроцесора
Існує 14 стандартних директив препроцесора:   #include #define #undef #if #ifdef #ifndef #elif #else #

Макроси
Директива #define для оголошення макросів має дві синтаксичні форми:   #define ідентифікатор макроозначення #define ідентифікатор (список параметрів) макроозначення

Конструктори
Раніше наведене оголошення класу CFrame дозволяє ініціалізувати змінні-члени об'єктів класу шляхом виклику програмою користувача функції-члена класу SetCoord(). В якості іншого, стандартно

Конструктори за умовчанням
Конструктор без аргументів називають конструктором за умовчанням. Такий конструктор звичайно ініціалізує змінні-члени, присвоюючи їм стандартні, встановлювані за умовчанням значення. Наприклад, нас

Деструктори
Відповідно до принципів об'єктно-орієнтованого програмування| в класі можна оголосити спеціальну функцію-член|, звану деструктором. Деструктор автоматично викликається кожного разу при зни

Правила спадкування
Спадкування, тобто породження одного класу з іншого, дозволяє повторно використовувати коди й структури даних, раніше створені для інших класів. Це робить програму зрозумілішою і допомагає в моделю

Переваги спадкування
Як випливає з приведених вище простих прикладів, спадкування дозволяє повторно використовувати створені раніше фрагменти програм і структури даних. Це дозволяє уникнути непотрібного дублювання прог

Конструктори приведення
Конструктор приведення класу — це конструктор з єдиним аргументом, тип якого відрізняється від типу класу. Такий конструктор звичайно ініціалізує новий об'єкт, використовуючи літерали, або дані змі

УЗАГАЛЬНЕНЕ ПРОГРАМУВАННЯ
Узагальнене програмування з використанням шаблонів мови C++ полегшує генерацію сімейств функцій або класів, що оперують множинами даних різних типів. При цьому не виникає необхідності створювати ок

Клас string
У мові C++ для представлення і обробки рядків є дві можливості. По-перше, можна використовувати символьний масив, що закінчується нулем і є рядком в стилі мови C, як це й робилося практичн

Потоки вводу - виводу
Як вже мовилося раніше, якщо програма на мові C починає виконуватися, автоматично відкриваються три потоки: stdin, stdout і stderr.Щось схоже має місце при завантаженні програми, написаної на мові

Класи потокового вводу - виводу
У C++ ввід - вивід забезпечується підключенням до програми заголовного файлу <iostream>. Саме в цьому файлі оголошені класи, що підтримують операції вводу – виводу. Система вводу – в

Прапори формату
Кожен потік вводу - виводу пов'язаний з набором прапорів формату (format flags), які управляють способом форматування інформації і є бітовими масками. Ці маски оголошені в класі ios як дані перелік

Закриття файлу
Для закриття файлу використовується функція-член| close(). Наприклад, щоб закрити файл, пов'язаний з потоком mystream, необхідна наступна інструкція:   mystream.close ();

Контроль стану вводу - виводу
В системі вводу - виводу C++ підтримується інформація про стан після кожної операції вводу - виводу. Поточний стан потоку вводу - виводу, який зберігається в об'єкті типу iostate, є переліком, визн

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

Мова програмування Visual Basic .NET
Хоча мови програмування керований C++, С# та Visual Basic .NET (VB) семантично мають практично однакові можливості, оскільки всі вони базуються на загальній специфікації мов програмування .NET (CLS

Цикл For
В мові С++ цикл for має дещо інший синтаксис, ніж цикл For в мові VB, але концепція залишається тою ж самою, якщо не зважати на те, що операція, яка виконується в кінці кожної ітерації, має бути вк

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги