для всієї структури в цілому ділянку пам'яті фіксованого розміру, а також не може зіставити з окремими компонентами структури конкретні адреси. Для вирішення проблеми адресації динамічних структур даних використовується метод, званий динамічним розподілом пам'яті, тобто пам'ять під окремі елементи виділяється в момент, коли вони «починають існувати» в процесі виконання програми, а не під час компіляції. Компілятор в цьому випадку виділяє фіксований обсяг пам'яті для зберігання адреси динамічно розміщується елемента, а не самого елемента.
Динамічна структура даних характеризується тим що:
- Вона не має імені;
- Їй виділяється пам'ять в процесі виконання програми;
- Кількість елементів структури може не фіксуватися;
- Розмірність структури може змінюватися в процесі виконання програми;
- В процесі виконання програми може змінюватися характер взаємозв'язку між елементами структури.
Необхідність в динамічних структурах даних зазвичай виникає в наступних випадках.
Використовуються змінні, що мають досить великий розмір (наприклад, масиви великої розмірності), необхідні в одних частинах програми і абсолютно не потрібні в інших.
У процесі роботи програми потрібен масив, список чи інша структура, розмір якої змінюється в широких межах і важко передбачуваний.
Коли розмір даних, що обробляються в програмі, перевищує обсяг сегмента даних.
Разом з тим, зв'язне уявлення не позбавлено і недоліків, основними з яких є наступні:
На поля, що містять покажчики для зв'язування елементів один з одним, витрачається додаткова пам'ять;
Доступ до елементів зв'язної структури може бути менш ефективним за часом. Порядок роботи з динамічними структурами даних наступний:
- Створити (відвести місце в динамічній пам'яті);
- Працювати за допомогою покажчика;
- Видалити (звільнити зайняте структурою місце).
У багатьох задачах потрібно використовувати дані, в яких конфігурація, розміри і склад можуть змінюватися в процесі виконання програми. Для їх подання використовують динамічні інформаційні структури. До таких структур відносять:
- Односпрямовані (однозв'язні) списки;
- Двонаправлені (двузв’язні) списки;
- Циклічні списки;
- Стек;
- Черга;
- Бінарні дерева.
Препроцессори
У С # визначено ряд директив препроцесора, що впливають на інтерпретацію вихідного коду програми компілятором. Ці директиви визначають порядок інтерпретації тексту програми перед її трансляцією в об'єктний код в тому вихідному файлі, де вони з'являються. Термін директива препроцесора з'явився у зв'язку з тим що подібні інструкції за традицією оброблялися на окремій стадії компіляції, званої препроцесором. Обробляти директиви на окремій стадії препроцесора в сучасних компіляторах вже не потрібно, але сама її назва закріпилася. Нижче наведені директиви препроцесора, визначені в С #
#define #elif #else #endif #endregion #error
#if #line #pragma #region #undef #warning
Шаблони класів
Шаблони класів визначають сімейство пов'язаних класів, заснованих на типі аргументів, переданих класу при створенні його примірника.
Шаблони функцій
Шаблони функцій схожі на шаблони класів, але визначають сімейство функцій. За допомогою шаблонів функцій можна задавати набори функцій, заснованих на одному коді, але діють в різних типах або класах.
Обробка виняткових ситуацій
Блок try використовується програмістами C # для розбиття на розділи коду, який може порушуватися винятком. Пов'язані з ним блоки catch використовуються для обробки можливих винятків. Блок finally, що містить код, що виконується незалежно від того, чи викликано виняток у блоці try, наприклад звільнення ресурсів, виділених блоку try. Блоку try потрібно один або кілька пов'язаних блоків catch або блок finally (або і те, і інше).
Стандартні виключення С++. Альтернативні методи обробки
Фундаментальна ідея обробки помилок полягає в тому, що функція, яка виявила проблему, але не знає як її вирішити, генерує виняток у надії, що викликала її (безпосередньо чи опосередковано) функція зможе вирішити виниклу проблему. Функція, яка хоче вирішувати проблеми даного типу, може вказати, що вона перехоплює такі винятки. Механізм обробки виключень надає альтернативу традиційним методам в тих випадках, коли вони не достатні, чи не елегантні і схильні помилками. Він надає спосіб явного відділення коду обробки помилок від «звичайного» коду, роблячи таким чином програму більш читабельною і краще підходить для різних інструментальних засобів. Механізм обробки виключень надає більш регулярний спосіб обробки помилок, спрощуючи в результаті взаємодія між окремо написаними фрагментами коду.
Огляд стандартної бібліотеки С++
Стандартна бібліотека С++ включає стандартну бібліотеку Сі з невеликими змінами, які роблять її відповіднішою для мови С++. Інша велика частина бібліотеки С++ заснована на Стандартній Бібліотеці Шаблонів (STL). Вона надає такі важливі інструменти, як контейнери (наприклад, вектори і списки) і ітератори (узагальнені вказівники), що надають доступ до цих контейнерів як до масивів. Крім того, STL дозволяє схожим чином працювати і з іншими типами контейнерів, наприклад, асоціативними списками, стеками, чергами.
Використовуючи шаблони, можна писати узагальнені алгоритми, здатні працювати з будь-якими контейнерами або послідовностями, доступ до членів яких забезпечують ітератори.
Так само, як і в С, можливості бібліотек активізуються використанням директиви #include для включення стандартних файлів. Всього в стандарті Сі++ визначено 50 таких файлів.
Загальна характеристика контейнерних класів
Контейнерами називаються об’єкти, що містять інші об’єкти. Контейнери управляють розміщенням об’єктів в оперативній пам’яті, використовуючи конструктори, видаляють об’єкти з памяті за допомогою деструкторів, а також додають і видаляють об’єкти за допомогою операцій вставки й видалення. У стандартній бібліотеці описано 10 шаблонних класів контейнерів.
Vector