etc

[C++] std::vector reserve와 resize 메소드에 대해

조부장 2020. 8. 21. 23:21

std::vector의 메소드 중에 reserve, resize에 대해 알아봅시다. 두 메소드는 글자가 비슷한것도 그렇고 뭔가 비슷해보이지만 많이 다릅니다.

 

size vs capacity

두 메소드에 대해 알아보기 전에 size와 capacity의 차이에 대해 알아보겠습니다.

간단하게 설명하면 vector는 일정 크기의 배열을 할당한 뒤 push_back을 계속 해서 size가 capacity를 넘어가려고 하면 2배 크기의 배열을 만들어 이동하는 식으로 구현이 되어 있습니다. (Implementation defined. msvc에서는 1.5배씩 늘립니다)

여기서 미리 할당해놓은 배열의 크기가 capacity, 할당해놓은 배열에 들어 있는 원소의 수가 size입니다.

C++ vector의 size와 capacity의 차이점

그림으로 표현하면 이렇게 됩니다.

 

1. vector::reserve

constexpr void reserve(size_type new_cap);

reserve는 vector의 capacity를 new_cap으로 설정하는 메소드입니다. new_cap이 현재 capacity보다 클 때만 동작하고, new_cap이 현재 capacity보다 작으면 아무 일도 일어나지 않습니다.

new_cap이 capacity보다 클 때 모든 iterator와 모든 원소 레퍼런스가 전부 invalidate되니 주의가 필요합니다.

 

2. vector::resize

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

resize는 count만큼 배열의 원소 개수를 조정하는 메소드입니다.

vector::resize의 size와 count의 관계에 따른 동작 과정

size > count인 경우 원소의 개수를 줄입니다.

size < count인 경우 입력된 value가 없으면 value_type의 기본생성자를 호출해 size가 count가 되도록 늘립니다. value가 입력된 경우 

 

문제

vector<int> v1, v2;
v1.reserve(10000);
v2.resize(10000);

cout << "v1.size(): " << v1.size() << '\n';
cout << "v1.capacity(): " << v1.capacity() << '\n';

cout << "v2.size(): " << v2.size() << '\n';
cout << "v2.capacity(): " << v2.capacity() << '\n';

이 코드를 실행하면 어떻게 나올까요?

먼저 v1은 배열만 할당해놓고 아무것도 채워놓지 않은 상태입니다. 반면 v2는 배열 원소 10000개를 기본값 즉 0으로 할당해놓은 상태입니다.

v1.size(): 0
v1.capacity(): 10000
v2.size(): 10000
v2.capacity(): 10000

결과는 이렇습니다. v1, v2 둘 다 메모리는 1만칸 분량이 할당되어있기 때문에 capacity는 10000입니다.

v1의 size는 내부 원소가 하나도 없으니 0, v2의 size는 resize로 조정되었으니 10000이 됩니다.

 

참고

반응형