일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 영화 리뷰
- Effective c++
- 메타테이블
- 영화
- 암시적 변환
- 다형성
- 오블완
- c++
- 예외
- 게임
- 티스토리챌린지
- 언리얼
- Smart Pointer
- effective stl
- Vector
- exception
- implicit conversion
- 스마트 포인터
- 루아
- virtual function
- UE4
- 반복자
- lua
- 상속
- 참조자
- resource management class
- operator new
- more effective c++
- 비교 함수 객체
- reference
- Today
- Total
목록2024/12 (18)
스토리텔링 개발자
항목 36. copy_if를 적절히 구현해 사용하자 copy 알고리즘모던 C++ 이전에는 아래와 같은 copy 알고리즘들만이 있었다.copycopy_backwardreplace_copyreverse_copyreplace_copy_ifunique_copyremove_copyrotate_copyremove_copy_ifpartial_sort_copyuninitialized_copy즉, copy_if가 없어서 구현해야 했다.어떤 식으로 구현해서 사용했었는지 재미로나마 알아보자. copy_if가 필요한 상황bool isDefective(const Widget& w); // Widget이 문제가 있는지 알려주는 함수vector widgets;...// c++11 이전에는 이게 안됐다..copy_if(widg..
항목 35. 대소문자를 구분하지 않는 문자열 비교는 mismatch 아니면 lexicographical_compare를 써서 간단히 구현할 수 있다. 대소문자를 구분하지 않기구분하지 않는 정도를 얼만큼이나 원하는가.국제화(internationalization) 사항은 무시하고 단지 strcmp 동작 정도만 원한다면 쉽다.다국어 처리까지 원한다거나, 기본 로케일 이외의 로케일을 사용한다면 어렵다.하지만 이번 항목에서 다루는 것은 쉬운 버전이다. 문자열을 비교하는 인터페이스 두 가지strcmp와 비슷한 인터페이스음수, 0, 양수를 반환한다.operatortrue, false를 반환한다. 첫 번째 버전// 대소문자 구분 없이 문자 비교 함수int ciCharCompare(char c1, char c..
항목 34. 정렬된 범위에 대해 동작하는 알고리즘이 어떤 것들인지 파악해 두자 알고리즘은 늘 범용적이진 않다.모든 알고리즘이 어떤 범위든 받아서 잘 동작하는 것은 아니다.remove(항목 32, 33 참조) 알고리즘은 대입 연산이 가능한 순방향 반복자만을 받는다.map과 set에는 사용할 수 없다.(항목 22 참조)정렬 알고리즘(항목 31 참조)은 임의 접근 반복자만을 받는다.list에는 사용할 수 없다.이런 규정을 어길 시 컴파일이 되지 않고, 에러 메시지(항목 49 참조)가 발생한다.특히, 정렬된 범위를 넣어야 하는 알고리즘에 정렬되지 않은 범위를 넣는다면미정의 구현이므로 어떤 결과가 나타날지 모른다. 정렬된 범위를 넣어야 하는 알고리즘정렬된 범위를 넘겨야 원하는 효율이 나오는 알고리즘binar..
항목 33. remove와 비슷한 알고리즘을 포인터의 컨테이너에 적용할 때에는 각별히 조심하자 포인터 요소 제거품질 보증 함수를 기준으로 벡터의 Widget 포인터 요소를 삭제하는 코드class Widget{public:... bool isCertified() const; // Widget의 품질이 확실한가...};vector v;...v.push_back(new Widget);...// 품질 보증이 되지 않은 Widget 객체 삭제// mem_fun(항목 41 참조)v.erase(remove_if(v.begin(), v.end(), not1(mem_fun(&Widget::isCertified))), v.end());만약 remove_if 호출 전 상황이 아래와 같다면remove_if 호출 후에..
항목 32. 요소를 정말로 제거하고자 한다면 remove 류의 알고리즘에는 꼭 erase를 붙여 사용하자 remove 알고리즘선언부templateForwardIterator remove(ForwardIterator first, ForwardIterator last, const T& value);보다시피, 컨테이너 자체를 받지 않는다.그렇다면 remove가 삭제를 처리하기 위해서는?삭제를 위해 제공되는 해당 컨테이너의 멤버 함수를 호출하는 방법 뿐일 것이다.하지만 실제 동작은 아래와 같다..vector v;v.reserve(10);for(int i = 1 ; i 왜냐하면 remove는 어느 것도 '진짜로' 없애지 않기 때문이다.remove는 자신이 제거하려고 하는 요소를 가진 컨테이너가 무엇인지 모르기..
항목 31. 정렬시의 선택 사항들을 제대로 파악해 놓자 sort 알고리즘은 정말 좋은 알고리즘이지만.. 늘 최적은 아니다.상황별 정렬 알고리즘을 알아보자.partial_sort항상 전체 데이터의 정렬이 필요하진 않다.예컨대 vector에서 가장 좋은 20개의 Widget만을 골라야 하는 경우라면,상위 20위까지의 Widget만을 정렬하면 된다.이럴 때 partial sort를 사용한다.bool qualityCompare(const Widget& lhs, const Widget& rhs){ // lhs의 품질이 rhs의 품질보다 좋으면 true를 반환}// 가장 뛰어난 20개의 요소를 앞에서부터 순서대로 정렬partial_sort(Widgets.begin(), widgets.begin() + 20..
항목 30. 알고리즘의 데이터 기록 범위(destination range)는 충분히 크게 잡자 컨테이너 요소 삽입 시int transmogrify(int x); // 정수 x를 받아 어떤 새로운 값을 만드는 함수vector values;... // values에 데이터를 넣는다.// values 요소들에 transmogrify를 적용하고 result에 삽입한다.// 하지만, 버그가 있다.vector results;transform(values.begin(), values.end(), results.end(), transmogrify);transform 결과 기록 순서values[0]을 매개변수로 가져온다.transmogrify를 호출하여 값을 변환한다.*results.end()에 대입한다.values..
항목 29. 문자 단위의 입력에는 istreambuf_iterator의 사용도 적절하다 텍스트 파일을 string 객체로ifstream inputFile("interastingData.txt");// inputFile을 읽어 fileData에 저장한다.// 하지만 정확한 답은 아니다.// 문법의 경우 항목 6 참조string fileData((istream_iterator(inputFile)), istream_iterator());이 경우 공백(whitespace) 문자를 객체에 복사하지 못한다..istream_iterator는 스트림을 읽을 때 operator이 연산자 함수는 공백 문자를 스킵한다.ifstream inputFile("interastingData.txt");inputFile.unset..