CPP

[C++] std::vector resize와 reserve의 차이점

CGNY 2025. 5. 6. 22:30

STL의 대표 컨테이너인 vector의 resize와 reserve의 차이점을 알아보도록 하자.

resize는 코테 공부를 할 때 정말 많이 사용했었는데 reserve는 가끔만 사용했었는데 둘의 차이점이 있다는 점정도만 알고 넘어가다가 도저히 안될거같아서 정리한 글이다...ㅠ

 

우선 vector자체는 가변배열이다. 데이터를 push_back하다가 보면 현재 동적할당받은 크기를 넘어서는 순간 다시 현재 사이즈 보다 더큰 배열을 동적할당하여 데이터를 새로 동적할당한 곳으로 복사한다.

 

이렇게 동적할당하고 복사하고~ 이런 과정의 비용이 비싸기 때문에 동적할당을 한번만 수행하여 비용을 낮추는데 주로 사용되는 vector의 멤버 변수가 두가지가 있다. 바로 resize, reserve이다.

 

(동적할당이 어떻게 발생하고 어떻게 복사되는지는 다루지 않겠다.)

추가적으로 동적할당하고 복사하는 과정이 있기 때문에 멀티쓰레드 환경에서 안전하지 않다는 것도 기억을 하자.

 

쨋든 다시 돌아와서 resize는 capacity도 늘리고 원소들을 초기화 해주는 함수이고(size도 늘리는 멤버함수이고)

reserve는 capacity만 늘린다.(배열 원소들의 값을 초기화 하지 않는다. 공간만 할당한다.)

 

size는 배열에 들어있는 원소의 개수를 말하고 capacity는 할당받은 전체 사이즈를 말한다.

resize는 capacity를 늘리면서 원소들의 값을 초기화 한다.

주의할게 resize할때마다 capacity가 줄어들지는 않는다. 가령 resize(10)을 한 경우 capacity가 10이지만 

resize(5)를 한다고 해서 capacity가 5가 되지는 않는다. (10을 그대로 유지한다.)

reserve(20)을 하고 reserve(10)을 한경우도 마찬가지이다. capacity가 10으로 줄어들지는 않는다.

 

resize는 함수는 아래처럼 정의되어 있다.

constexpr void resize(size_type count);
constexpr void resize(size_type count, const value_type& value);

공간을 할당받으면서 값을 내가 원하는 값으로 초기화 해주고 싶다면 resize의 두번째 매개변수에 값을 넣으면 된다.

 


resize는 공간할당 + 초기화를 담당하고 reserve는 공간만 할당한다.

이정도만 숙지해도 괜찮은듯 하다.