std::vector를 제대로 알고, 제대로 쓰고 있는가를 파악할 때 내가 자주 하는 질문은

reserve와 resize에 대해 설명해 보세요.

의외로 많은 프로그래머가 제대로 대답하지 못한다.

저 질문을 대답하기 위해서는 size와 capacity에 대해서 잘 알고 있어야 하는데..

사실, std::vector을 사용하기에 앞서 어떻게 구현이 되어있을까? 라고 고민을 해보면 추측할 수 있는 문제가 아닌가 하는 안타까움이 들때가 많다.

이제 막 입문하는 사람은 그렇다 치고, 어느정도 사용하다보면, 당연히 가지게 되는 의문과 고민, 추측이 아닌가?

그것은 나만 기대하는 욕심인 것인가?

위 그림을 보면 대부분은 이해할 것이라고 생각한다.

capacity는 vector의 요소(element)들을 담을 수 있는 메모리가 할당되어 있는 공간의 용량이다.

size는 실제 유효한 요소(element)들의 갯수이다.

예를 들어, push_back함수를 통해 새로운 요소(element)를 맨뒤에 한개 추가할 때,

capacity > size보다 큰 상황이면 그냥 맨뒤의 공간에 요소를 복사해 넣고 ++size만 일어나며,

capacity == size 이면 capacity가 증가한 새로운 연속된 공간을 할당하고… 기존의 모든 요소들을 복사하여(기존 정보는 지우고..) capacity > size인 상황을 만들어 놓고, 맨뒤에 요소를 복사해 놓고, ++size를 하는 과정이 일어나는 것이다.

reserve는 이 capacity를 프로그래머가 원하는 크기로 할당을 해준다.

여기까지 size, capacity, reserve에 대해서 이해했으리라 믿고, Effective STL의 항목 14. reserve는 필요 없이 메모리가 재할당되는 것을 막아 준다.(Use reserve to avoid unnecessary reallocations)를 공부해 보길 바란다.

여기서는 resize에 대해서 조금 더 이야기를 해보려고 한다.

resize에 대해서 다음과 같이 설명하는 사람에게는 나는 70점을 줄 것이다.

지정한 수 만큼 요소를 만들어 준다. 내부에서 capacity가 작으면 재할당이 일어나며…

resize에서 한가지 더 중요한 것이 있는데, 증가되는 size만큼 복사생성자가 호출된다는 점이다.

(c++11까지는 복사생성자가 호출 됬었는데, 최신은 생성자가 호출된다.)

resize의 원형을 보자

C++ 11 이전 버젼이든 C++ 11 이후 버젼이든, 기본값을 따로 지정하지 않으면, default 생성자에 의해서 모든 요소가 초기화 된다는 사실은 동일하다.

과거에 이렇게 코딩한 사람을 본적이 있는데… 이는 resize의 스펙을 잘 모르고 한 바보같은….


참고

http://en.cppreference.com/w/cpp/container/vector/size

http://en.cppreference.com/w/cpp/container/vector/capacity

http://en.cppreference.com/w/cpp/container/vector/reserve

http://en.cppreference.com/w/cpp/container/vector/resize

Effective STL, 2001, Scott Meyers