안녕하세요. chogahui05입니다. ps를 하시다 보면, 테스트 케이스 문제를 많이 보셨을 겁니다. 보통, vector를 클리어 할 때, clear 메소드를 많이 이용하고요. 여기서 한 가지 질문. clear 메소드는 정말 vector가 할당했던 모든 것을 깔끔하게 clear 할까요? 답은 그렇다는 보장이 없다입니다. 링크에서, reallocation is not granteed 라는 문구를 보시면 알 수 있습니다.

 

 


다음 코드를 보도록 하겠습니다.

 

 

 v에 5개의 원소를 넣습니다. 그리고 size와 capacity를 출력합니다. 다음에 vector의 clear 메서드를 호출한 다음에 다시, size와 용량을 출력해 주는 capacity를 출력합니다.

 

 

 결과 값을 보면, 1번째 줄에는 5와 8이, 2번째 줄에는 0과 8이 나왔습니다. 중요한 것은, capacity의 값이 8로 변한 게 없었다는 것입니다. 5개의 원소를 저장하기 위해 할당한 공간은, 해제되지 않았음을 알 수 있습니다. 링크의 Complexity 단락을 보면, 기본적으로는 선형 시간이라고 되어 있는데, 특정한 조건에서는 may be optimized Constant 시간이라는 문구가 있습니다.

 

 이 부분에 대해서 설명을 해 보겠습니다. int형, double형. 이들은 POD type입니다. 이들에 대해서는, size와 관련이 있는 position만 0으로 이동시켜 버리면 됩니다.

 

 

 예를 들어, 현재 size가 5라면, pos가 5입니다.

 

 clear가 되었다면 이들을 모두 제로필을 하는 게 아니라, pos 값만 0으로 이동시키면 됩니다. 그러면, 노란색으로 칠한 값들이 모두 무효화가 됩니다. 이런 식으로 clear가 구현이 되어 있다면, pos의 값을 변경시키는 것은, O(1)입니다. Constant time에 됩니다.

 

 

 문제는 이런 식으로, 벡터에 POD type이 아닌 것을 넣어버리는 경우가 있습니다. moo 클래스는 POD type이 아닙니다.

 

 

 그러면, 원소가 무효화 될 때, position만 이동하면 안 됩니다. 소멸자도 같이 호출이 되어야 합니다.

 

 

 5 8이 출력되고, erased가 5번 호출이 되었다는 것을 알 수 있어요. 그리고, 0 8이 출력이 되었는데요. 이는 소멸자가 5번 호출되었음을 의미합니다. 1번째 size와 capacity를 찍을 때와, 2번째 size와 capacity를 찍을 때, erased가 찍힌 횟수는 vector의 size와 비례했습니다.

 

 

 이는, 무효화된 원소와 연결된 객체들을 그대로 놔두는 경우 leak이 발생할 수도 있기 때문인 것으로 보입니다.

 

 


 정리를 하면, clear는 벡터의 capacity를 줄인다는 보장이 없습니다. 단지, size를 0으로 만들어버리는 것 뿐입니다.

 

 

 그러면, vector를 완전히 초기화 하는 방법은 없을까요? 그 중 하나의 방법은, swap trick을 이용하는 것입니다.

 

 

 11번째 줄은, vector <int>()와 v를 swap 합니다.

 

 

 실행 결과는 위와 같습니다. swap 메서드에 대한 이야기는 다음에 해 보도록 하겠습니다.