공부/C || C++

C++ vector의 resize vs reserve

sudo 2021. 8. 25. 10:09

vector에는 resize 함수와 reserve 함수가 있다. 언뜻 보기에 같은 동작을 하는 것 처럼 보이지만 다른 동작을 하는 함수다. 

 

void resize (size_type n, value_type val = value_type());

vector는 미리 할당된 공간에 element를 채우면서, 할당된 공간이 모두 차면, 2배 크기의 새로운 공간을 할당해서 element를 옮겨준다. 여기서 말하는 '미리 할당된 공간'을 capacity라고 하며, 'element가 실제로 들어있는 공간'을 size라고 부른다. 예를 들어서 벡터에 미리 할당된 공간이 4개라고 가정하고, 1,2,3 각각을 vector에 push_back했다고 가정해보자.

vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);

그렇다면 벡터는 아래 그림과 같은 상황일 것이다.

1 2 3  

즉, 실제로 element가 들어가 있는 공간은 3만큼 이지만, 실제 element가 들어갈 수 있는 총 공간의 크기는 4이다. 여기서 element가 들어가 있는 공간의 크기가 size, element가 들어갈 수 있는 총 공간의 크기가 capacity이다.

 

resize는 여기서 size를 설정해주는 함수로써, 지금 위의 상황은 size가 3이지만 vec.resize(4)를 호출하면 3번 인덱스에 0이 채워지고 size는 4가 될 것이다.

 

void reserve (size_type n);

reserve 함수는 단순히 capacity만 설정해주는 함수로써, 지금 capacity보다 작은 값이 인자로 들어오면 아무런 동작도 하지 않는다. 아래 코드를 보면 vec1은 capacity만 100개 할당된, 아무런 element도 채워지지 않은 상태인 반면에, vec2는 capacity도 100이면서 동시에 100개의 element(0)이 채워져 있을 것으로 예상할 수 있다.

 

int main()
{
	std::vector<int> vec1;
	std::vector<int> vec2;

	vec1.reserve(100);
	vec2.resize(100);

	std::cout << "vec1 size : "<< vec1.size() << std::endl;
	std::cout << "vec1 capacity : "<< vec1.capacity() << std::endl;

	std::cout << "vec2 size : " << vec2.size() << std::endl;
	std::cout << "vec2 capacity : " << vec2.capacity() << std::endl;

	return 0;
}

 

 

Reference

https://www.cplusplus.com/reference/vector/vector/resize/

 

vector::resize - C++ Reference

myvector contains: 1 2 3 4 5 100 100 100 0 0 0 0

www.cplusplus.com

https://www.cplusplus.com/reference/vector/vector/reserve/

 

vector::reserve - C++ Reference

public member function std::vector::reserve void reserve (size_type n); Request a change in capacity Requests that the vector capacity be at least enough to contain n elements. If n is greater than the current vector capacity, the function causes

www.cplusplus.com