Clear
Vector의 내부를 초기화해주는 함수이다.
즉, 내부에 들어있는 값을 모두 없애주는데 이 때 Vector 내부 원소의 타입이 클래스일 경우 소멸자를 호출해서 삭제해준다.
그렇다고 Clear()함수를 사용하면 정말 모든 내용이 초기화되냐라고 하면 그것은 아니다.
우선 이해를 위해 Vector의 동작방식을 간단하게 설명하자면, Vector의 경우 처음에 일정 크기를 할당해두고 Vector에 일정 크기 이상으로 원소가 계속 추가되면 크기를 재할당 하는 방식으로 동작한다.
이 때, Vector의 size는 현재 Vector에 들어있는 원소의 수, Vector의 capacity는 현재 늘어나있는 Vector의 크기라고 이해하면 된다.
여기서 Clear 함수의 문제가 생기는데, Clear를 이용하면 Vector의 size는 0으로 초기화 되지만, capacity는 초기화 되지 않을 수 있다.
Vector의 capacity까지 초기화 하는 방법은 몇가지가 있는데 여기선 2가지만 알아보도록 하자.
1. swap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
int main()
{
std::vector<int> vec(32, 1);
cout << "size : " << vec.size() << ", capacity : " << vec.capacity() << endl;
vec.clear();
cout << "size : " << vec.size() << ", capacity : " << vec.capacity() << endl;
std::vector<int> temp(vec);
temp.swap(vec); // 임시객체를 이용한 교체 방법
// std::vector<int>(vec).swap(vec);
cout << "size : " << vec.size() << ", capacity : " << vec.capacity() << endl;
return 0;
}
|
cs |

swap 함수를 이용한 방법이다.
1. 초기화 할 Vector, vec를 clear 함수를 이용해서 내부 값과 size를 0으로 변경해준다.
2. 임시 객체 temp를 생성하고 temp에는 현재 vec에 있는 값을 그대로 넣어준다.
- 현재 vec에는 아무런 값도 들어있지 않으므로 temp 또한 아무런 값도 삽입되지 않았을 것이다.
3. 임시 객체 temp와 기존 vec를 swap 해주면, 벡터 간의 swap이 이루어져서 vec의 capacity 또한 0으로 초기화 된다.
11~12 라인은 이해를 위해 코드를 풀어 쓴 것이고 일반적으로는 14 라인처럼 한 줄에 코드를 줄여서 사용한다.
2. vector::shrink_to_fit()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
int main()
{
std::vector<int> vec(32, 1);
cout << "size : " << vec.size() << ", capacity : " << vec.capacity() << endl;
vec.clear();
cout << "size : " << vec.size() << ", capacity : " << vec.capacity() << endl;
vec.shrink_to_fit();
cout << "size : " << vec.size() << ", capacity : " << vec.capacity() << endl;
return 0;
}
|
cs |
C++ 11에서 새로 도입 된 shrink_to_fit() 함수 또한 내부적으로는 위에서 배운 swap 함수와 같은 동작을 한다.
결론
clear 함수 만으로는 벡터의 초기화가 완벽하게 이루어지지 않을 수 있으므로 유의하자.
swap 함수 혹은 shrink_to_fit 함수를 사용할 경우 Vector를 초기화 할 때 뿐만이 아니라 기존에 있던 원소에서 일정 원소를 삭제하고, 그 상태에서 Vector의 capacity를 조절할 때도 사용할 수 있다.
하지만 이런 경우 Vector의 size만큼 임시 vector를 할당해야만 하며, 임시 vector에 기존 Vector의 모든 원소를 복사생성 해 주어야 하고, 마지막으로 Vector 간의 모든 원소를 교환하는 과정이 필요하다.
이런 과정은 기존 Vector의 size가 크면 클수록 더 많은 시간을 소모하게 되는 등 매우 비싼 작업이다.
따라서 무분별하게 남발하지 말고 꼭 필요한 경우에만 사용할 수 있도록 하자.
틀린 부분이나 이상한 부분이 있으면 댓글로 편하게 지적해주세요!
감사합니다!
참고 링크
'C,C++ > 정보정리' 카테고리의 다른 글
[C/C++] 표준 템플릿 라이브러리(STL) - (1) (2) | 2023.01.18 |
---|---|
[C/C++] Reference(참조) (0) | 2022.10.11 |
[C/C++] Vector 함수(push_back, emplace_back) (1) | 2022.10.05 |
[C/C++] 가상함수 (0) | 2022.09.30 |
[C/C++] 파일 입출력 함수 정리 (0) | 2022.09.27 |
댓글