2008.07.13 16:48 책 정리/Effective STL
"항목 2를 보면 독립적인 코드는 환상일 뿐이다" 라고 말하고 있듯이, 컨테이너 마다 원소 삭제 방법이 다르다. Sequence Containers 와 Associative Containers 의 차이점이 있으니, Effective 하게 사용 하라는  이야기이다.

정리하자면 총 3가지의 지우는 방법이 있다.

첫째, Container 속의 특정값을 가진 원소를 지우고자 할 때
Sequence Containers 의 경우,
 erase-remove 합성문이 제일 효율적 이다.

잠깐 위 코드가 이해가 안간다면 std::remove 알고리즘이 어떻게 작동하는지 안다면, 이해가 될 것이다.

하지만 std::list Container 는 멤버함수 remove 가 더 효율적 일 것이다.

Associative Container 의 경우 remove 멤버 함수도 없고, 알고리즘을 써서 한다면 Associative Container 자체가 일시적으로 무너지는 꼴이 되고야 만다.(책에선 컴파일이 안될수 있다 하여 해보았다.  MSVC2005에선 컴파일이 된다!!)

그렇기 때문에 Associative Containers 에선 그냥 멤버함수 erase 를 호출하여 지우는게 더 효율적이다.


둘째, Container 속에서 특정 조건(TRUE or FALSE)에 만족하고자 하는 원소를 삭제하고자 할 때
Sequence Containers 의 경우
코드 1-1 처럼, erase-remove_if 로 손쉽게 가능하며 list의 경우 remove_if 멤버 함수가 제일 효율적이다.

Associative Containers 의 경우
Container의 원소가 삭제되면,  iterator가 무효화되어 버리기 때문에 아래와 같이 코딩하는게 제일 효율적이다.


셋째, 삭제하면서, 로그를 남기고자 할 때
우선 Associative Containers 의 경우
2-1에서 if문 안에서 로그를 기록하면 된다.


Sequence Containers 의 경우
... 루프를 돌면서 삭제하고 기록하는 방법 밖에 없다. . 이게 흠이라고 필자는 설명하고 있다.


관련링크
http://jeddli.tistory.com/entry/STL-컨테이너에서-특정한-값을-가진-객체-지우기


posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요