일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- lua
- Effective c++
- iterator
- effective modern c++
- operator new
- UE4
- 스마트 포인터
- 암시적 변환
- 보편 참조
- std::async
- c++
- 오블완
- 영화 리뷰
- exception
- 참조자
- effective stl
- virtual function
- 반복자
- 언리얼
- Smart Pointer
- universal reference
- 예외
- 영화
- more effective c++
- reference
- implicit conversion
- 티스토리챌린지
- resource management class
- 게임
- 상속
Archives
- Today
- Total
스토리텔링 개발자
[Effective STL] 44. 같은 이름의 멤버 함수 vs 알고리즘 본문
728x90
항목 44. 같은 이름을 가진 것이 있다면 일반 알고리즘 함수보다 멤버 함수가 더 낫다
알고리즘과 같은 이름의 멤버 함수
- 연관 컨테이너
- count
- find
- lower_bound
- upper_bound
- equal_range
- list
- remove
- remove_if
- unique
- sort
- merge
- reverse
멤버 함수가 더 나은 이유
- 멤버 함수가 더 빠르다.
- 멤버 함수가 해당 컨테이너와 더 잘 맞물려 있다.
- 사실, 같은 이름의 알고리즘과 멤버 함수는 대개 정확히 똑같은 동작을 하진 않기 때문에 차이가 난다.
연관 컨테이너 예시
set<int> s;
... // 1,000,000개의 값을 넣는다.
// 멤버 함수 사용
// 로그 시간에 실행된다.
set<int>::iterator i = s.find(727);
if(i != s.end()) ...
// 알고리즘 사용
// 선형 시간에 실행된다.
set<int>::iterator i = find(s.begin(), s.end(), 727);
if(i != s.end()) ...
- 멤버 find
- 약 40(최악의 경우)에서 약 20(평균)번의 비교
- 연관 컨테이너이므로 동등성(equivalence)을 기준으로 삼는다. (항목 19 참조)
- 만일 map류 컨테이너라면 key에 대해서만 비교하여 탐색한다.
- 알고리즘 find
정말 효율을 신경 쓴다면?
list 멤버 함수
- 알고리즘은 객체를 복사하지만, 멤버 함수는 복사를 전혀 하지 않는다.
- 리스트 노드를 연결하는 포인터를 조작할 뿐이다.
- 알고리즘과 멤버 함수의 알고리즘적 복잡도는 동일하다.
- 허나, 포인터 조작이 객체 복사보다 빠르다.
- 멤버 함수와 알고리즘은 다르게 동작하는 경우도 있다.
- 알고리즘이라면 컨테이너에서 진짜로 객체를 제거하려면 erase-remove를 함께 사용해야 한다.(항목 32 참조)
- 하지만 멤버 함수는 그렇지 않다.
- 정렬 동작도 차이가 난다.
- sort 알고리즘
- list는 양방향 반복자이므로, list를 정렬할 수 없다.
- merge 알고리즘
- 작업 대상이 되는 범위를 건드릴 수 없지만, 멤버 함수는 항상 거리낌없이 바꾼다.
- sort 알고리즘
728x90
'Effective C++ > Effective STL' 카테고리의 다른 글
[Effective STL] 46. 함수 vs 함수 객체(람다) (0) | 2025.01.16 |
---|---|
[Effective STL] 45. 탐색 전략 선택 (0) | 2025.01.15 |
[Effective STL] 43. 루프 vs 알고리즘 (0) | 2025.01.13 |
[Effective STL] 42. less<T> (0) | 2025.01.10 |
[Effective STL] 41. ptr_fun, mem_fun, mem_fun_ref(C++98) (0) | 2025.01.09 |
Comments