동적 배열
- 동적 배열의 작동 원리에 대해서는 stl vector를 참고하여 제작
- vector의 최초 capacity는 클래스에서 static으로 선언하여 모든 인스턴스가 공유하도록 함
namespace ya
{
template <typename T>
class vector
{
public:
private:
static constexpr size_t DEFAULT_CAP = 32;
T* mArr;
size_t mSize;
size_t mCapacity;
};
}
- size는 실제로 벡터가 담고 있는 요소의 개수
- capacity는 실제 할당된 메모리
- 동적 배열의 작동 원리는 size >= capacity일 때마다 capacity *= 1.5~2를 해서 옮겨 담는 것
- 실제 stl vector는 이 구현이 좀 더 복잡함
vector(size_t cap = DEFAULT_CAP)
: mArr(new T[cap])
, mSize(0)
, mCapacity(cap)
{}
- 벡터의 생성자에서는 cap의 초기 값이 지정되지 않을 경우 데이터영역의 DEFAULT_CAP의 값을 가져옴
- 초기 capacity만큼 arr를 할당해주고 size 초기화
vector(const vector& other)
: mArr(new T[other.mCapacity])
, mSize(other.mSize)
, mCapacity(other.mCapacity)
{
for (size_t i = 0; i < other.mSize; i++)
{
mArr[i] = other.mArr[i];
}
}
- 복사 생성자는 초기 capacity는 other의 capacity를 가져와서 초기화해주는 것
- 그 외 기본 생성자와 크게 다르지 않음
~vector()
{
delete[] mArr;
}
- 소멸자는 단순히 생성자에서 할당했던 메모리를 해제해주는 것
vector& operator=(const vector& other)
{
if (this != nullptr)
{
if (mCapacity < other.mCapacity)
{
delete[] mArr;
mArr = nullptr;
mCapacity = other.mCapacity;
mArr = new T[mCapacity];
}
for (size_t i = 0; i < other.mSize; i++)
{
mArr[i] = other.mArr[i];
}
mSize = other.mSize;
}
return *this;
}
- 복사 대입 연산자는 대입되는 other의 크기를 가져와서 비교하고
- 만약 other의 capacity가 더 크다면 그 크기를 other의 크기에 맞게 새로 할당하는 것
- 그 외 복사 생성자와 동일
void push_back(const T& data)
{
if (mSize >= mCapacity)
{
if (mCapacity < DEFAULT_CAP)
{
mCapacity = DEFAULT_CAP;
}
else
{
mCapacity *= 2;
}
T* newArr = new T[mCapacity];
for (size_t i = 0; i < mSize; i++)
{
newArr[i] = mArr[i];
}
delete[] mArr;
mArr = nullptr;
mArr = newArr;
}
mArr[mSize] = data;
mSize++;
}
- 위에서 언급했던 동적 배열 capacity 증가 관련 로직이 처리되는 단계
- push_back 함수가 호출됐을 때 capacity와 size를 비교하여 size >= capacity라면 capacity *= 2로 재할당
'C++ > [AssortRock] C++ 기초 다지기' 카테고리의 다른 글
CPP_1. AssortRock 15일차 오프라인 수업_220927 (0) | 2022.09.28 |
---|---|
CPP_1. AssortRock 14일차 오프라인 수업_220926 (0) | 2022.09.27 |
CPP_1. AssortRock 9일차 오프라인 수업_220919 (0) | 2022.09.20 |
CPP_1. AssortRock 8일차 오프라인 수업_220916 (0) | 2022.09.18 |
CPP_1. AssortRock 7일차 오프라인 수업_220915 (0) | 2022.09.16 |
댓글