본문 바로가기
C++/[AssortRock] C++ 기초 다지기

CPP_1. AssortRock 13일차 오프라인 수업_220923

by 헛둘이 2022. 9. 27.
동적 배열
  • 동적 배열의 작동 원리에 대해서는 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로 재할당

 

댓글