컨테이너 객체 바로 알고 쓰기

컨테이너에 객체를 삽입할 때

컨테이너에 앞이나 뒤에 객체를 추가할 때 각각 push_back과 push_front 함수를 사용합니다. 특정 위치에 객체를 추가하는 경우가 아닐 때 주로 사용하는 함수이지만, push_back과 push_front는 어떠한 반환 값도 없기 때문에 추가한 객체에 대해서는 잊어버려야 합니다. 만일 객체를 추가한 뒤에도 여전히 그 객체를 참조해야 하는 경우라면 insert 함수를 사용하는 것이 좋습니다.

[리스트 1]

vector intvector ;
intvector.push_back(5) ;
intvector.insert(intvector.end(), 5) ;

[리스트 1]에서 push_back과 insert는 동일한 역할을 하지만, insert는 새로 추가한 객체를 참조할 수 있는 iterator를 반환합니다.

컨테이너에서 객체를 삭제할 때

vector와 list의 객체를 삭제할 때 두 컨테이너는 다르게 동작합니다. vector의 경우 객체가 삭제되어도 실제로 할당되어 있는 메모리는 해제하지 않습니다.
중간의 객체가 삭제되는 삭제된 객체 이후의 객체들을 복사하여 당겨 붙이기를 합니다. 그리고, 사용하지 않는 메모리는 erase 멤버 함수를 사용해서 일괄적으로 해제하도록 되어 있습니다. erase 멤버 함수는 파라미터로 전달된 iterator 이후의 모든 메모리를 해제해버립니다.

반면 list는 객체를 노드 단위로 관리하기 때문에 remove 함수를 실행하여 객체를 삭제할 때 바로 erase 멤버 함수를 호출하여 노드가 할당하고 있던 메모리를 역시 해제합니다. 따라서 list의 erase 멤버 함수는 iterator 이후가 아닌 iterator가 가리키는 노드만 삭제하고, vector의 erase와 동일하게 동작하도록 하려면 erase의 두 번째 매개변수에 list의 end iterator를 넘겨주어야 합니다.

Comments are closed.

Website Built by WordPress.com.

Up ↑