На главную Динамическим
считается массив, который способен в любой момент изменять свой размер.
Эта возможность обеспечивается за счет динамического выделения памяти
под массив. При этом удобно создать класс, который является оболочкой
для данного массива, отвечает за выделение и освобождение памяти под
массив, а также обеспечивает доступ к элементам массива.
Когда пользователь создает объект класса-оболочки, конструктор класса
выделяет память под массив, который имеет либо указанный пользователем
размер, либо размер, заданный по умолчанию. Если по мере заполнения
массива вся выделенная память окажется занятой, то при добавлении
очередного элемента выделенная ранее память освобождается, все
хранящиеся в массиве значения сохраняются во временном массиве. Затем
выделяется память под массив большего размера и в него помещаются
сохраненные значения. Таким образом, изменение размера массива
происходит автоматически, невидимо для пользователя.
В настоящее время практически отпала необходимость использовать
подобные динамические массивы, поскольку такие структуры данных,
называемые контейнерами,
в большом ассортименте представлены в стандартной библиотеке шаблонов
С++ - Standard
template library (STL), которая поддерживается практически
всеми компиляторами. Наиболее типичным примером является класс vector,
который содержит все необходимые функции и итераторы. Также полезными
являются такие классы-контейнеры, как map, multymap, queue, deque, list, set, multyset.
Краткое описание: map -
ассоциативный массив, который содержит пары "ключ - значение",
обеспечивает доступ к значению по ключу. multymap -ассоциативный
массив, в котором могут встречаться одинаковые по значению ключи. queue -
очередь, т.е. массив, организованный по принципу FIFO ("first in first
out") deque -
очень напоминает vector; также как и vector поддерживает произвольный
доступ к элементам, но не поддерживает некоторые функции, которые
присутствуют в классе vector. list -
список, которые не поддерживает доступ к элементу по индексу; вместо
этого осуществляется поиск элемента по значению. set -
множество (или простой ассоциативный массив), которое отличается от
ассоциативного массива тем, что в нем ключ является одновременно и
значением (имеет интерфейс, напоминающий интерфейс map, что позволяет
безболезненно их чередовать) multyset
- множество, в котором могут встречаться одинаковые по значению ключи.
В приведенной ниже программе на С++ реализованы далеко не все возможные
и полезные функции для работы с динамическими массивами, т.к. она
создана только для демонстрации принципа создания такого рода массивов.
Определение класса:
template<class T> class DynamicArray { long size; //размер массива long count; //количество элементов в массиве T* p; //указатель на начало массива
public: //конструкторы DynamicArray(long s = 10): size(s), count(0) { p = new T[size]; if(!p) cout << "Ошибка при создании массива" << endl; } DynamicArray(const DynamicArray& arr); //конструктор копирования
//функции void add(T x); //прибавить элемент в конец массива void remove(); //удалить последний элемент long length() const {return size;} //длина массива void print() const; //вывод на экран