Publish:

태그: , ,

카테고리:

vector 구현해보자!! (2)

resize()

설명

처음 vector가 생성되면 iMaxCount 가 2 이다.

만일 2개가 넘는 데이터가 들어오게 되면 어떻게 될까?

할당되지 않은 메모리에 접근한다는 경고가 뜰 것이다.

1

그렇기에 우리는 기존의 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;
}

동작

다음과 같이 작동하는 것을 볼 수 있다. 2

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 형식으로 반환받으면 복사본을 바꿔 주는 것이기 때문에 무용지물이다.

동작

1

방문해 주셔서 감사합니다!😊

업데이트:

댓글남기기