쓸데없이 남은 용량은 “바꿔치기(swap)묘수”를 써서 업애 버리자

어떤 vector가 있다고 할때 push_back, insert 나 범위 생성자로 vector의 할당된 용량이 늘어나 버렸다면 erase 등을 호출 하여 데이타를 삭제한다고 해도 이미 할당된 용량이 줄어들지는 않는다.
이런 경우

vector<Object>(v).swap(v);
위의 코드를 사용하면 할당된 용량이 데이타의 개수와 딱맡는 v로 만들수 있게 된다.
코드가 처리되는 방식은

  1. 복사생성자 에 의해 딱맞는 크기를 갖는 vector<Object> 임시객체가 v를 복사해서 생성
  2. swap() 에 의해서 백터의 데이타가 뒤바뀜
  3. 코드가 끝나면서 임시객체 소멸
  4. v는 타이트 해짐
으로 이해 하면 된다. (string에도 적용가능)
또한 swap는 컨테이너를 완전히 비우고 용량을 라이브러리 구현코드가 허용하는 최소치로 줄이는 데에도 쓸 수 있다.
vector<Object> v;
string s;

vector<Obect>().swap(v);
string().swap(s);

swap을 일반적으로 서로다른 컨테이너끼리 사용할 경우에 swap 일어난 후에도 원래의 컨테이너의 요소를 가르키는데 사용되던 모든 반복자나 포인터, 참조나는 다른 컨테이너로 옮겨간 이후에도 그대로 유지된다고 한다.(뭔소린지 -_-)

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다