#include <cstring>
#include <string>
template <class T_> class DynamicArray
{
public:
DynamicArray()
{
size = 0;
capacity = 4;
dynamicArray = new T_[capacity];
}
DynamicArray(unsigned int initialCapacity)
{
size = 0;
capacity = initialCapacity;
dynamicArray = new T_[capacity];
}
~DynamicArray()
{
delete[] dynamicArray;
}
void insert(T_ value)
{
if(size + 1 > capacity)
{
capacity *= 2;
T_ *tmpDynamicArray = new T_[capacity];
memmove(tmpDynamicArray, dynamicArray, size * sizeof(T_));
delete[] dynamicArray;
dynamicArray = tmpDynamicArray;
}
dynamicArray[size++] = value;
}
void erase(unsigned int index)
{
bool resize = (size - 1 < capacity / 2);
bool lastElement = (index == size - 1);
if(resize || !lastElement)
{
if(resize)
{
capacity /= 2;
}
T_ *tmpDynamicArray = new T_[capacity];
if(!lastElement)
{
if(index > 0)
{
memmove(tmpDynamicArray, dynamicArray, (index - 1) * sizeof(T_));
memmove(tmpDynamicArray + index - 1, dynamicArray + index,
(size - index) * sizeof(T_));
}
else if(index == 0)
{
memmove(tmpDynamicArray, dynamicArray + 1, (size - 1) * sizeof(T_));
}
}
else
{
memmove(tmpDynamicArray, dynamicArray, (size - 1) * sizeof(T_));
}
delete[] dynamicArray;
dynamicArray = tmpDynamicArray;
}
--size;
}
const T_ &get(unsigned int index) const
{
return dynamicArray[index];
}
T_ &operator[](unsigned int index)
{
return dynamicArray[index];
}
const unsigned int &getSize() const
{
return size;
}
const unsigned int &getCapacity() const
{
return capacity;
}
private:
T_ *dynamicArray;
unsigned int size;
unsigned int capacity;
};