일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- c++
- 영화 리뷰
- 암시적 변환
- exception
- 게임
- 티스토리챌린지
- 예외
- 상속
- 스마트 포인터
- 영화
- 메타테이블
- UE4
- 오블완
- 다형성
- Vector
- 루아
- Effective c++
- lua
- virtual function
- 비교 함수 객체
- 반복자
- operator new
- 언리얼
- 참조자
- resource management class
- implicit conversion
- effective stl
- reference
- Smart Pointer
- more effective c++
- Today
- Total
목록effective stl (44)
스토리텔링 개발자
항목 44. 같은 이름을 가진 것이 있다면 일반 알고리즘 함수보다 멤버 함수가 더 낫다 알고리즘과 같은 이름의 멤버 함수연관 컨테이너countfindlower_boundupper_boundequal_rangelistremoveremove_ifuniquesortmergereverse 멤버 함수가 더 나은 이유멤버 함수가 더 빠르다.멤버 함수가 해당 컨테이너와 더 잘 맞물려 있다.사실, 같은 이름의 알고리즘과 멤버 함수는 대개 정확히 똑같은 동작을 하진 않기 때문에 차이가 난다. 연관 컨테이너 예시set s;... // 1,000,000개의 값을 넣는다.// 멤버 함수 사용// 로그 시간에 실행된다.set::iterator i = s.find(727);if(i != s.end()) ...// 알고..
항목 43. 어설프게 손으로 작성한 루프보다는 알고리즘이 더 낫다 알고리즘은 루프모든 알고리즘은 보통 최소 두 개의 반복자(시작 반복자, 끝 반복자)를 받는다.즉, 내부적으로 보면 알고리즘은 루프이다.class Widget{public: ... void redraw() const; ...};list lw;...// 다음 작업은..for(list::iterator i = lw.begin() ; i != lw.end() ; ++i){ i->redraw();}// 알고리즘으로 똑같이 할 수 있다.for_each(lw.begin(), lw.end(), mem_fun_ref(&Widget::redraw)); 루프보다 알고리즘이 나은 이유효율(Effeciency)알고리즘은 프로그래머가 ..
항목 42. less는 operator less의 기본 동작아래처럼 기본적으로 무게로 정렬되는 Widget이 있다.class Widget{public: ... size_t weight() const; size_t maxSpeed() const; // 무게로 정렬되는 operator헌데, 최대 속도(maxSpeed)를 가지고 정렬하는 multiset을 만들고 싶다면?multiset의 기본 비교 함수는 less이다.하지만, less은 기본적으로 Widget 객체 두 개에 대해 operator 문제 해결하기(잘못된 예)템플릿 특수화로 less과 operator// 템플릿 특수화로 처리한다.templatestruct std::less{ bool operator()(cons..
항목 41. ptr_fun, mem_fun, mem_fun_ref의 존재에는 분명한 이유가 있다 참고 : 현재도 사용할 수 있지만, 람다 등에 의해 이제 사용 빈도가 지극히 낮아졌다.ptr_fun, mem_fun, mem_fun_ref가 하는 일우선 함수 호출 문법 종류를 알아보자.f(x); // 1. 멤버 함수가 아닌 경우x.f(); // 2. x의 멤버 함수인 경우xp->f(); // 3. x의 멤버 함수이나, x의 포인터로 호출된 경우그리고 아래의 코드를 보자.// case 1void test(Widget& w); // w를 검사하고, 실패 시 failed를 출력하는 함수vector vw1;...for_each(vw1.begin(), vw1.end(), test); // 컴파일 성공// 이 경우..
항목 40. 함수 객체 클래스는 어댑터 적용이 가능하게(adaptable) 만들자 C++11 이후로는 더 이상 맞지 않는 이야기이므로 참고할 것.ptr_fun와 adaptable아래는 잘 동작하는 코드이다.list widgetPtrs;bool isInteresting(const Widget* pw);list::iterator i = find_if(widgetPtrs.begin(), widgetPtrs.end(), isInteresting);if(i != widgetPtrs.end()){ ... // interesting한 widget에 대한 첫째 포인터 처리}그렇다면 int..
항목 39. 술어 구문은 순수 함수로 만들자 술어 구문(predicate)bool값을 반환하는 함수판독의 기준이 되는 로직을 포함하는 구문이다. 순수 함수(pure function)함수가 반환하는 값이 그 함수의 매개 변수에 종속되는 함수f(x, y)의 반환값은 x, y가 바뀔 때에만 변한다.즉, 매개변수가 아닌 내부에 존재하는 데이터는 const여야 한다. 술어 구문 클래스(predicate class)operator()가 술어 구문인 함수 객체 클래스 술어 구문 클래스는 복사에 신경써야 한다.함수 객체는 값으로 전달되기 때문이다.(항목 38 참조)그리고 STL 알고리즘이 내부적으로 함수 객체의 사본을 따로 보관할 수도 있다.그러므로 술어 구문 함수는 반드시 순수 함수여야 한다. 잘못 ..
항목 38. 함수 객체 클래스는 값으로 전달되도록(pass-by-value) 설계하자 매개변수로서의 함수와 함수 객체함수는 포인터 형태로 매개변수로 넘겨진다.void qsort(void* base, size_t nmemb, size_t size, int (*cmpfcn)(const void*, const void*));// cmpfcn을 자세히 살펴보면 값으로 전달되고 있음을 알 수 있다.// 즉, 함수 포인터는 값으로 전달된다.STL 함수 객체는 이 함수 포인터를 본떴으므로, 동일하게 값으로 전달된다.templateFunction for_each(InputIterator first, InputIterator last, Function f);// Function은 값 전달 / 값 반환이 이루어짐을 알..
항목 37. 범위 내의 데이터 값을 요약하거나 더하는 데에는 accumulate나 for_each를 사용하자 범위 요약(summarize)예를 들자면컨테이너 string 요소들의 길이의 총합을 구한다.주어진 범위의 숫자들의 곱을 구한다.좌표 등 2차원 이상의 값들의 평균을 구한다. 헤더에 있는 수치 알고리즘인 accumulate을 사용하자. accumulateaccumulate의 첫 번째 형태두 개의 반복자와 초기값을 인자로 받는다.범위 내의 값의 합 + 초기 값을 반환한다.list ld;...double sum = accumulate(ld.begin(), ld.end(), 0.0);// 0.0을 초기값으로 주었기에, 합을 double로 하여 정상값이 리턴된다.double sum = accum..