vector 구현해보기! (2)
카테고리: CppStudy
vector 구현해보자!! (2)
resize()
설명
처음 vector가 생성되면 iMaxCount 가 2 이다.
만일 2개가 넘는 데이터가 들어오게 되면 어떻게 될까?
할당되지 않은 메모리에 접근한다는 경고가 뜰 것이다.
그렇기에 우리는 기존의 size 가 2인 배열을 버리고 조금 더 큰 배열을 할당해주어야 한다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 클래스 외부
#include <cassert> // 경고 알림 assert 함수 헤더
// 클래스 내부
public:
void resize(int _resize);
// 클래스 외부
template<typename T>
void CArr<T>::push_back(const T& _data)
{
if(m_iMaxCount <= m_iCount)
{
resize(m_iMaxCount * 2);
}
m_pData[m_iCount++] = _data;
}
template<typename T>
void CArr<T>::resize(int _resize)
{
if(_resize <= m_iMaxCount)
assert(nullptr);
T* pNew = new T[_resize];
for(int i = 0; i < m_iCount; i++)
{
pNew[i] = m_pData[i];
}
delete[] m_pData;
m_pData = pNew;
m_iMaxCount = _resize;
}
동작
다음과 같이 작동하는 것을 볼 수 있다.
vector[ ] operator
설명
vector는 기본적으로 배열과 같이 vector[1]
와 같은 operator 를 지원한다.
우리가 int a = vector[2]
혹은 vector[1] = x
와 같이 사용할 수 있다.
여기서 우리가 구현해야 할 것은 [ ] 연산자이다.
= 연산자는 구현하지 않아도 된다. vector 내부의 자료형은 string 이고 이 string 클래스는
기본적으로 = 연산자를 가지고 있기 때문이다.
이제 구현해보자.
코드
1
2
3
4
5
6
7
8
9
10
// 클래스 내부
public:
T& operator [] (int ix);
// 클래스 외부
template<typename T>
T& CArr<T>::operator [] (int ix)
{
return m_pData[ix];
}
여기서 T&
이라는 참조형식을 보게 되는데 이는 해당 데이터의 원본을 받기 위함이다.
우리가 vector[ix] = 2
와 같이 데이터 원본을 바꿔 주어야 하는데
일반적인 T
형식으로 반환받으면 복사본을 바꿔 주는 것이기 때문에 무용지물이다.
댓글남기기