#pragma once
template <typename T>
class CArray
{
public:
CArray()
{
mCapacity = 4;
mArray = new T[mCapacity];
}
~CArray()
{
delete[] mArray;
}
private:
T* mArray;
int mSize = 0; // 배열 원소의 개수
int mCapacity; // 배열의 cap
public:
void push_back(const T& Data)
{
// 꽉 찼을 경우
if (mSize == mCapacity)
{
ReAlloc();
}
mArray[mSize] = Data;
++mSize;
}
void pop_back()
{
if (mSize == 0)
return;
--mSize;
}
int size() const
{
return mSize;
}
int capacity() const
{
return mCapacity;
}
bool empty() const
{
return mSize == 0;
}
void clear()
{
mSize = 0;
}
void reserve(int Capacity)
{
mCapacity = Capacity;
T* Array = new T[mCapacity];
// 기존 배열을 제거한다.
delete[] mArray;
// 새로 만든 배열의 주소를 멤버변수에 지정한다.
mArray = Array;
mSize = 0;
}
void resize(int Size)
{
mCapacity = Size;
T* Array = new T[mCapacity];
// 기존 배열을 제거한다.
delete[] mArray;
// 새로 만든 배열의 주소를 멤버변수에 지정한다.
mArray = Array;
mSize = Size;
}
// Random Access operator overloading하기
T& operator [] (int Index) const
{
return mArray[Index];
}
private:
// 화끈하게 기존 cap의 2배 크기의 배열을 새로 동적할당하여 기존 배열을 대체하기
void ReAlloc()
{
mCapacity *= 2;
T* Array = new T[mCapacity];
memcpy(Array, mArray, sizeof(T) * mSize);
// 기존 배열을 제거한다.
delete[] mArray;
// 새로 만든 배열의 주소를 멤버변수에 지정한다.
mArray = Array;
}
};
답은 상황에 따라 다르다. Linked List는 하나하나에 대해서 붙이는 Node를 동적할당해 생성하는 반면, Array는 배열의 크기를 보고 자리가 남으면 바로 붙이고 없으면 더 큰 크기의 배열을 동적할당->기존배열의 원소 복사 -> 기존배열 동적해제와 같은 과정을 거치게 된다.