더북(TheBook)

컨테이너에 할당된 용량이 그렇게 클 필요가 없다면, 즉 원소를 추가하지 않을 것이라면 shrink_to_fit() 멤버를 호출해서 용량을 줄일 수 있다.

data.shrink_to_fit();     // 원소에 필요한 크기로 줄인다

shrink_to_fit()의 동작은 STL 구현체에 따라 다르게 동작한다. shrink_to_fit()이 동작했다면 사용 중인 반복자는 무효화될 것이므로 이 연산 이후에는 새로운 반복자를 얻는 게 최선이다.

하나 또는 여러 원소를 삭제할 때는 vectorerase() 함수 멤버를 호출하면 된다. 원소 하나를 제거할 때는 반복자 하나만 인수로 사용하면 된다.

auto iter = data.erase(std::begin(data)+1);     // 두 번째 원소를 삭제한다

원소를 삭제했으니 vectorsize는 1이 줄어들지만, capacity는 변하지 않는다. erase()가 반환한 반복자는 삭제된 원소의 다음 원소를 가리킨다. 즉, 이 값은 std::begin(data)+1로 표현할 수 있다. 삭제된 원소가 마지막 하나 남은 원소였다면 반환된 반복자는 std::end(data)가 된다.

원소 순차열을 제거하고 싶다면 삭제할 원소들의 범위를 두 반복자로 지정하면 된다.

auto iter = data.erase(std::begin(data)+1, std::begin(data)+3); // 2, 3번째 원소 삭제

기억하자. 범위 지정에서 두 번째 반복자는 삭제할 원소에서 하나 더 뒤를 가리킨다. 즉, 이 문장은 std::begin(data)+1std::begin(data)+2를 삭제한다. erase()가 반환하는 반복자는 삭제된 원소의 다음 원소를 가리키므로 std::begin(data)+1이 된다. 마지막 하나 남은 원소가 삭제되었다면 std::end(data)가 된다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.