Array

Ryan Ham·2024년 6월 12일
0
#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;
	}
};


Q : 원소를 뒤에 붙이는 상황에서 LinkedList과 Array 둘 중 어떤게 더 자원이 비쌀까?

답은 상황에 따라 다르다. Linked List는 하나하나에 대해서 붙이는 Node를 동적할당해 생성하는 반면, Array는 배열의 크기를 보고 자리가 남으면 바로 붙이고 없으면 더 큰 크기의 배열을 동적할당->기존배열의 원소 복사 -> 기존배열 동적해제와 같은 과정을 거치게 된다.

profile
🏦KAIST EE | 🏦SNU AI(빅데이터 핀테크 전문가 과정) | 📙CryptoHipsters 저자

0개의 댓글