
- •Динамические структуры данных. Сравнения статических и динамических структур данных. Область применения динамических структур.
- •Способы реализации динамических структур.
- •Достоинства и недостатки динамических структур.
- •Определение списка, стека, очереди.
- •Реализация динамических структур в stl.
- •Понятие наследования. Базовый и порожденные классы. Ключи доступа.
- •Ненаследуемые методы и операции.
- •Инициализация объекта порожденного класса.
- •Перегрузка функций.
- •Виртуальные методы.
- •Механизм позднего связывания.
- •Определение класса и объектов класса.
- •Элементы классов: поля и методы. Видимость элементов класса.
- •Указатель this.
- •Статические поля и методы класса.
- •Специальные методы класса — конструкторы и деструкторы.
- •Понятие дружественности.
Динамические структуры данных. Сравнения статических и динамических структур данных. Область применения динамических структур.
Обычные переменные характеризуются фиксированным количеством памяти выделяемым на них, например это простые числа или обычные массивы. К примеру если описана переменная int a или массив int b[100] то их размер будет жестко известен. Однако бывает необходимость создания структуры данных объем которых будет изменяться в процессе работы кода. Динамические структуры применяются для более эффективной работы с данными, когда мы не знаем точного количества элементов которые будут храниться.
Способы реализации динамических структур.
Для реализации элементов динамической структуры данных в С++ используют тип данных, называемый структура (struct). Это поименованная совокупность элементов расположенных в памяти компьютера последовательно. Пример описания структуры:
struct имя_структуры
{
тип1 имя_элемента;
тип2 имя_элемента;
… } s1, s2 // А это список статических переменных (определителей) данной структуры.
Можно определить объекты данного типа как сразу после ее описания (s1, s2), так и потом как обычные переменные. Например опишем структуру, создадим простую переменную и массив из 10 элементов:
struct student
{
int group;
double average_score; }
student s3; // Простая переменная.
student s4[10]; // Массив из 10 элементов.
s3.group = 1; // Задаем значение элемента в объекте структуры.
student * s5 = &s3; // Определили указатель который может указывать на любой объект в памяти данной структуры.
s5->group = 2; // Через указатель чтоб обратиться к элементам вместо точки делаем так.
Динамическая структура всегда образована засчет обычных структур содержащих по крайней мере два поля: какое-нибудь с данными и указателя на такую же структуру (чтоб указывать на следующий или предыдущий элемент в списке). Например:
struct el
{
int a;
el * b; }
Характеристики динамических структур: взаимосвязь элементов и набор типовых операций.
Каждая динамическая структура характеризуется, во-первых, взаимосвязью элементов, и, во-вторых, набором типовых операций над этой структурой. В случае динамической структуры важно решить следующие вопросы:
каким образом может расти и сокращаться данная структура;
каким образом можно включить в структуру новый и удалить существующий элемент;
как можно обратиться к конкретному элементу структуры. Доступ по индексу здесь явно неудобен, так как структура динамическая и порядок элементов всегда можно измениться.
То есть в зависимости от способа реализации динамической структуры (стэк, список, очередь) будут меняться и характеристики. Про них – читай дальше.
Достоинства и недостатки динамических структур.
Достоинства:
более эффективная работа с памятью, чем при работе с массивом;
более эффективная сортировка элементов, удаление и вставка, так как работа идет только с указателями, которые хранят лишь адрес объекта в памяти;
количество элементов структуры может не фиксироваться;
размерность структуры может меняться в процессе выполнения программы;
в процессе выполнения программы может меняться характер взаимосвязи между элементами структуры.
Недостатки:
на поля, содержащие указатели для связывания элементов друг с другом, расходуется дополнительная память;
проблема с быстрым доступом к элементам. Обычно он осуществляется путем последовательного перебора элементов с помощью указателей на следующий и/или предыдущий в структуре.