더북(TheBook)

remove() 연산 이후에 words의 원소들을 출력해보면 처음 다섯 개의 원소만 표시될 것이다. 그러나 벡터의 size()를 호출해서 반환된 값은 여전히 7이다. 즉, 마지막 두 원소가 여전히 거기에 있으며 빈 string 객체로 치환되어 있을 뿐이다. 이러한 잉여 원소들을 제거하려면 벡터의 erase() 멤버를 호출해야 한다. remove()가 반환한 반복자를 다음과 같이 이용할 수 있다.

words.erase(iter, std::end(words)); // 잉여 원소 제거하기

이를 erase-remove 이디엄(idiom)이라 부른다. iter 반복자는 삭제 후에 마지막 원소에서 하나 더 뒤를 가리키므로 범위에서 삭제될 첫 번째 원소를 가리킨다. 삭제될 범위의 끝은 std::end(words)로 지정했다. 물론, 한 문장으로 원소들을 제거하고 뒤에서부터 원하지 않는 원소들을 삭제할 수도 있다.

words.erase(std::remove(std::begin(words), std::end(words), "none"), std::end(words));

remove() 알고리즘이 반환한 반복자가 erase()의 첫 번째 인수가 된다. erase()의 두 번째 인수는 컨테이너에서 마지막 원소 하나 더 뒤를 가리키는 반복자다.

벡터 컨테이너에서 추가 용량이 어떻게 할당되는지 이해한다면 할당에 따른 부하가 얼마나 자주 발생할지, 메모리를 얼마나 할당할지 이해할 것이다. 여기 이에 대한 통찰을 얻을 수 있는 예제를 소개한다.

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