Рассмотрим реализацию класса dynamic_array - динамический массив, то есть массив, размер которого может изменяться.
Скачать реализацию класса dynamic_array.
Реализация класса представляет собой шаблон, параметром шаблона является тип хранимых в массиве элементов.
Закрытые поля класса:
m_size - размер массива (количество элементов в массиве, доступных пользователю).
m_capacity - "вместимость" массива, то есть размер выделенной памяти для хранения элементов. При увеличении размера массива если новый размер не превосходит m_capacity, то новые элементы можно создать в массиве без выделения дополнительной памяти.
m_data - указатель на область памяти, где хранятся сами элементы массива.
Конструктор по умолчанию создает пустой массив, не содержащий элементов.
public:
dynamic_array()
{
m_size = 0;
m_capacity = 0;
m_data = NULL;
}
Копи-конструктор создает копию существующего массива. Он нужен для того, чтобы при создании копии массива выделить новую память для хранения данных копии массива и скопировать туда все элементы. Если не сделать копи-конструктор, то при создании копии массива поле m_data у копии будет указывать на ту же область памяти, что и у исходного массива. Поэтому если в классе используется динамическое распределение памяти, то всегда необходимо создавать копи-конструктор.
Конструктор, который создает массив заданного размера.
Деструктор необходим для того, чтобы освободить выделенную память при удалении объекта.
Метод resize изменяет размер массива, новый размер передается параметром size. Если значение size не превосходит значения m_capacity, то этот метод только изменяет значение поля m_size, иначе необходимо перевыделить память - выделяется новая область памяти для хранения элементов, существующие элементы массива копируются из старой области памяти в новую, выделенная ранее память освобождается.
Для того, чтобы память не выделялась слишком часто, размер выделенной памяти удваивается по сравнению со старым размером массива.
Метод push_back добавляет один новый элемент в конец массива.
void push_back(T val)
{
resize(m_size + 1);
m_data[m_size - 1] = val;
}
Метод size возвращает размер массива.
Доступ к элементам массива перегрузим оператор []. Это позволит обращаться к элементам класса dynamic_array так же, как к элементам обычного массива: a[i].
Для вывода массива перегрузим оператор <<. Это необходимо сделать отдельной функцией после реализации класса dynamic_array.