2.3.6 원소를 삭제하기
앞에서 얘기한 것처럼 컨테이너 객체의 함수 멤버만 컨테이너의 원소들을 삭제할 수 있다. clear() 멤버를 호출해서 vector 객체에서 원소들을 모두 제거할 수도 있다.
std::vector<int> data(100, 99); // 100개의 원소를 99로 초기화 data.clear(); // 모든 원소를 제거
첫 번째 문장은 int 타입으로 원소 100개를 갖는 vector를 생성했으므로 size는 100이고, capacity도 100이다. 모든 원소는 99로 초기화되었다. 두 번째 문장은 원소들을 모두 제거하므로 size는 0이 된다. 그렇지만 capacity는 변경되지 않으므로 여전히 100이다.
pop_back() 함수를 호출해서 vector 객체의 마지막 원소를 삭제할 수 있다.
std::swap(std::begin(data)+1, std::end(data)-1); // 두 번째와 마지막 원소를 교환한다 data.pop_back(); // 마지막 원소를 제거한다
두 번째 문장은 마지막 원소를 제거하므로 data의 size는 99가 되지만, capacity는 100이 유지된다.
원소들의 순서에 신경 쓰지 않아도 된다면 원소들을 모두 이동하지 않아도 마지막 원소를 삭제하는 방법으로 원하는 원소를 제거할 수 있다. 벡터 data에서 두 번째 원소를 삭제하고 싶다고 하자. 그렇다면 이런 방법으로 할 수 있다.
std::swap(std::begin(data)+1, std::end(data)-1); // 두 번째와 마지막 원소를 교환한다 data.pop_back(); // 마지막 원소를 제거한다
첫 번째 문장은 algorithm 헤더나 utility 헤더에 정의된 swap() 템플릿 함수를 호출한다. 이 문장은 두 번째 원소와 마지막 원소를 교환한다. pop_back()을 호출해 두 번째 원소였던 마지막 원소를 제거하고, 결과적으로 컨테이너에서 소거된다.
Note ≣
vector 컨테이너에는 swap() 함수 멤버가 있다. swap()은 함수가 호출된 컨테이너의 원소와 인수로 전달된 벡터 컨테이너의 원소를 교환할 것이다. 두 벡터 컨테이너는 같은 타입의 원소를 저장하고 있어야 한다. 전역 함수 swap()도 인수로 전달된 두 벡터 컨테이너의 원소를 교환할 수 있다.