"항목 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-컨테이너에서-특정한-값을-가진-객체-지우기
정리하자면 총 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-컨테이너에서-특정한-값을-가진-객체-지우기
'책 정리 > Effective STL' 카테고리의 다른 글
항목 14 : reserve는 필요 없이 메모리가 재할당되는 것을 막아 준다. (1) | 2008.07.16 |
---|---|
항목 13 : 동적으로 할당한 배열보다는 vector와 string 이 낫다. (0) | 2008.07.15 |
항목 12 : STL 컨테이너의 쓰레드 안전성에 대한 기대는 현실에 맞추어 가지자. (0) | 2008.07.15 |
항목 11 : 커스텀 할당자를 제대로 사용하는 방법을 이해하자. (0) | 2008.07.15 |
항목 10 : 할당자(allocator)의 일반적인 사항과 제약 사항에 대해 잘 알아 두자. (2) | 2008.07.14 |
항목 8 : auto_ptr의 컨테이너는 절대로 만들지 말자. (0) | 2008.07.13 |
항목 7 : new로 생성한 포인터의 컨테이너를 사용할 대에는 컨테이너가 소멸되기 전에 포인터를 delete하는 일을 잊지 말자. (0) | 2008.07.13 |
항목 6 : C++ 컴파일러의 어이없는 분석 결과를 조심하자. (0) | 2008.07.13 |
항목 5 : 단일 요소를 단위로 동작하는 멤버 함수보다 요소의 범위를 단위로 동작하는 멤버 함수가 더 낫다. (0) | 2008.07.13 |
항목 4 : size()의 결과를 0과 비교할 생각이라면, 차라리 empty를 호출하자 (0) | 2008.07.12 |
최근댓글