일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 예외
- 영화
- operator new
- virtual function
- 암시적 변환
- 티스토리챌린지
- 참조자
- UE4
- reference
- 게임
- 영화 리뷰
- c++
- lua
- 언리얼
- Smart Pointer
- exception
- more effective c++
- implicit conversion
- resource management class
- 메타테이블
- 스마트 포인터
- 반복자
- effective stl
- 다형성
- 함수 객체
- Effective c++
- effective modern c++
- 상속
- 오블완
- 비교 함수 객체
- Today
- Total
목록Effective C++/Effective STL (50)
스토리텔링 개발자
항목 50. STL 관련 웹 사이트와 친구하자 해당 책이 쓰여질 때 가장 많이 찾던 사이트들(2001년)SGI STL 사이트실리콘 그래픽스가 파산하며, 현재는 사라졌다.STLporthttp://www.stlport.org/ SGI STL을 기반으로 멀티플랫폼을 타겟으로 개발되었다.Boosthttps://www.boost.org/표준으로 추가될 여지가 큰 기능들을 미리 활용해 볼 수 있다.
항목 49. STL에 관련된 컴파일러 진단 메시지를 해석하는 능력을 가지자 컴파일러 에러 예시 1vector v(10); // 크기 10의 벡터를 하나 만든다. 성공.string s(10); // 크기 10인 string 객체를 만든다? 실패비주얼 c++에서 아래와 같은 에러가 발생한다.example.cpp(20): error C2664:'__thiscall std::basic_string,class std::allocator>::std::basic_string,classstd::allocator >(const class std::allocator &)': cannot convertparameter 1 from 'const int' to 'const class std::allocator &' Reas..
항목 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)알고리즘은 프로그래머가 ..