일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- implicit conversion
- lua
- more effective c++
- 영화
- 암시적 변환
- 비교 함수 객체
- 스마트 포인터
- 티스토리챌린지
- resource management class
- 오블완
- Effective c++
- 반복자
- 메타테이블
- reference
- 게임
- virtual function
- 상속
- UE4
- 언리얼
- 예외
- c++
- 참조자
- 영화 리뷰
- 루아
- Smart Pointer
- 함수 객체
- operator new
- exception
- 다형성
- effective stl
- Today
- Total
목록effective stl (48)
스토리텔링 개발자
항목 48. 용도에 맞는 헤더를 항상 #include하자 표준 헤더 인클루드 관계플랫폼 별로 #include가 차이가 나는 상황이 생긴다C++ 표준안이 표준 헤더 사이의 인클루드 관계를 명확하게 정해두지 않았기 때문이다. 표준 STL 헤더 종류 정리거의 모든 컨테이너들은 같은 이름의 헤더에 정의되어 있다.벡터는 , 리스트는 ..에는 네 개를 제외한 모든 알고리즘이 선언되어 있다.에 나머지 넷이 선언되어 있다.accumulate(항목 37 참조)inner_productadjacent_difference,partial_sum에는 istream_iterator와 istreambuf_iterator(항목 29 참조)를 포함한 특별한 종류의 반복자들이 선언되어 있다.에는 표준 함수자(예컨대 less)와 함..
항목 47. 쓰기 전용(write-only) 코드는 만들지 말자 가독성이 떨어지는 코드의 예벡터에서 x보다 작은 값을 모두 지우되,y보다 크거나 같은 값 중 가장 마지막 것의 앞에 있는 건 지우지 않도록 하는 코드vector v;int x, y;...v.erase(remove_if(find_if(v.rbegin(), v.rend(), bind2nd(greater_equal(), y)).base(), v.end(), bind2nd(less(), x)), v.end()); // 1. v 벡터의 역순으로 순회하면서, y보다 크거나 같은 첫 번째 요소를 찾는다.// 이를 base()를 사용하여 정방향 반..
항목 46. 알고리즘의 매개 변수로는 함수 대신 함수 객체가 괜찮다 추상화(abstraction)와 성능추상화가 높을수록 코드의 효율은 낮아진다.그런데 함수 객체가 함수보다 빠르다니? double의 벡터를 내림차순으로 정렬하기vector v;...// 방법 1sort(v.begin(), v.end(), greater()); // 함수 객체 greater를 사용했다.// 방법 2inline bool doubleGreater(double d1, double d2){ return d1 > d2;}sort(v.begin(), v.end(), doubleGreater); // 함수를 사용했다.방법 1이 거의 확실히 더 빠르다.이유는 인라인화(inlining)이다. 인라인화(inlining)인라인으..
항목 45. count, find, binary_search, lower_bound, upper_bound, 그리고 equal_range를 제대로 파악해 두자 탐색 전략 선택빠르고 간단한 방법을 선택하면 된다.정렬되었는가?binary_search, lower_bound, upper_bound, equal_range대개 로그시간에 수행된다.정렬되지 않았는가?count, find 정렬되지 않은 요소 탐색 (count와 find)list lw;Widget w;...// w가 들어있는지 체크한다.// count를 사용한 방법if(count(lw.begin(), lw.end(), w)){ ...}// count를 사용한 방법 2if(count(lw.begin(), lw.end(), w) != 0){ ..
항목 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); // 컴파일 성공// 이 경우..