C++ 표준 템플릿 라이브러리(STL)에서 Vector 클래스는 새로운 요소들을 추가 및 제거할 때 동적으로 크기를 조절하는 시퀸스 컨테이너입니다.
이 중 벡터는 크기를 변경할 수 있는 두 가지 멤버 함수를 제공합니다. 하나는 resize()이며, 다른 하나는 reserve()입니다.
1. resize()
resize()는 벡터의 사이즈(=크기, size)를 사용자가 지정한 사이즈(=크기, size)로 변경합니다. 만약 새 사이즈가 현재 크기보다 크면 새롭게 추가된 값들을 기본값으로 채우며, 새 사이즈가 현재 사이즈보다 작으면 기존 벡터에서 가지고 있던 값 중 초과된 인자값들은 제거합니다. 말로써 이해하기 어려울 경우, 다음 예제를 확인해보세요.
#include <vector>
#include <iostream>
int main()
{
// 사이즈가 3인 벡터 설정
std::vector<int> v = {1, 2, 3};
// 현재 벡터의 사이즈 출력
// Output: v.size() = 3
std::cout << "v.size() = " << v.size() << std::endl;
// 벡터의 사이즈를 현재 크기보다 크게 설정 및 사이즈 출력
// Output: v.size() = 5
v.resize(5);
std::cout << "v.size() = " << v.size() << std::endl;
// 벡터 내부 요소들을 출력 (새 요소들은 기본값인 0으로 채워진다)
// Output: 1 2 3 0 0
for (int x : v)
std::cout << x << " ";
// 벡터의 사이즈를 현재 크기보다 작게 설정 및 사이즈 출력
// Output: v.size() = 2
v.resize(2);
std::cout << "v.size() = " << v.size() << std::endl;
// 벡터 내부 요소들을 출력
// Output: 1 2
for (int x : v)
std::cout << x << " ";
}
2. reserve()
reserve()는 벡터의 용량(=capacity)은 늘리지만, 사이즈(=크기, size)는 변경하지 않습니다. 나중에 벡터에 더 많은 인자 값들을 추가할 것임을 알고 있을 때, 불필요한 재 할당을 방지하여 벡터가 가진 성능을 최적화하는데 사용됩니다. 마찬 가지로 아래 예시를 참고하세요.
#include <vector>
#include <iostream>
int main()
{
// 사이즈가 3인 벡터 설정
std::vector<int> v = {1, 2, 3};
// 현재 벡터의 사이즈 및 용량 출력
std::cout << "v.size() = " << v.size() << std::endl;
// Output: v.size() = 3
std::cout << "v.capacity() = " << v.capacity() << std::endl;
// Output: v.capacity() = 3
// reserve()를 함수를 사용 한 후 현재 벡터의 사이즈 및 용량 출력
v.reserve(5);
std::cout << "v.size() = " << v.size() << std::endl;
// Output: v.size() = 3
std::cout << "v.capacity() = " << v.capacity() << std::endl;
// Output: v.capacity() = 5
// push_back()을 통해 사이즈를 채워주고 난 후 현재 벡터의 사이즈 및 용량 출력
v.push_back(4);
v.push_back(5);
std::cout << "v.size() = " << v.size() << std::endl;
// Output: v.size() = 5
std::cout << "v.capacity() = " << v.capacity() << std::endl;
// Output: v.capacity() = 5
}
요약하면, resize()는 벡터의 사이즈(=크기, size) 수를 변경하고 reserve()는 벡터의 용량(=capacity)를 변경합니다. resize() 함수를 이용하면 성능 면에서 reserve()보다 비싼 벡터의 메모리를 재 할당하는 과정이 필요한 반면, reserve() 함수는 새 용량(=capacity)이 부족한 경우가 아니라면, 벡터의 메모리를 재 할당을 일으키지 않습니다.
'공부 > C++' 카테고리의 다른 글
Dynamic_cast 내부동작은 어떻게 되는가? (0) | 2022.12.23 |
---|---|
가상 함수(Virtual Function)와 가상 함수 테이블(Virtual Function Table) 개념 및 차이 (0) | 2022.12.22 |
포인터(Pointer)와 참조자(Reference)의 차이 (1) | 2022.12.20 |
Vector push_back과 emplace_back의 차이 (0) | 2022.12.16 |
구조체(Struct)와 클래스(Class)의 개념과 차이 (2) | 2022.12.14 |