Publish:

태그: , ,

카테고리:

vector 구현해보자!! (3)

pop_back()

vector 내부에는 여러가지 함수가 존재하지만 맨 뒤의 요소를 제거해주는 pop_back() 을 구현해보자.

코드

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
// 클래스 내부
private:
  void resize(int _resize);
public:
  void pop_back();

// 클래스 외부
template<typename T>
void CArr<T>::pop_back()
{
    if(m_iCount <= 0) return;
    else if(m_iCount <= m_iMaxCount / 2)
    {
        resize(m_iMaxCount / 2);
    }
    m_pData[--m_iCount] = {};
}

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;
}

push_back() 함수를 통해 vector 에 요소를 넣는 과정에서

데이터 현재 개수가 최대 개수를 넘어가게 되면 resize 함수가 호출된다.

이와 반대로 pop_back() 함수를 통해 vector 에서 요소를 꺼내오는 과정은

데이터 현재 개수가 최대 개수의 절반이 되면 resize 함수를 호출한다.

이전에 resize 함수를 현재 데이터 개수보다 더 적은 개수를 대입하여 호출할까봐

예외 처리했던 부분은 주석처리하였고, 외부에서 호출하지 못하도록 private 으로 옮겼다.

동작

반복문을 처리하기 위해 다음 함수도 추가해주자.

1
2
3
// 클래스 내부
public:
  int size() { return m_iCount; }

1

배열의 시작주소와 m_iCount , m_iMaxCount 의 변화를 살펴보자.

11

다음과 같은 출력변화가 생긴다.

2

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

업데이트:

댓글남기기