일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- resource management class
- 스마트 포인터
- virtual function
- 메타테이블
- 상속
- c++
- 언리얼
- Effective c++
- 비교 함수 객체
- implicit conversion
- 영화 리뷰
- 영화
- UE4
- effective modern c++
- 암시적 변환
- more effective c++
- reference
- 게임
- 참조자
- 다형성
- operator new
- 오블완
- exception
- 함수 객체
- Smart Pointer
- effective stl
- 예외
- lua
- 티스토리챌린지
- 반복자
- Today
- Total
목록Effective C++/Effective STL (50)
스토리텔링 개발자
항목 34. 정렬된 범위에 대해 동작하는 알고리즘이 어떤 것들인지 파악해 두자 알고리즘은 늘 범용적이진 않다.모든 알고리즘이 어떤 범위든 받아서 잘 동작하는 것은 아니다.remove(항목 32, 항목 33 참조) 알고리즘은 대입 연산이 가능한 순방향 반복자만을 받는다.map과 set에는 사용할 수 없다.(항목 22 참조)정렬 알고리즘(항목 31 참조)은 임의 접근 반복자만을 받는다.list에는 사용할 수 없다.이런 규정을 어길 시 컴파일이 되지 않고, 에러 메시지(항목 49 참조)가 발생한다.특히, 정렬된 범위를 넣어야 하는 알고리즘에 정렬되지 않은 범위를 넣는다면미정의 구현이므로 어떤 결과가 나타날지 모른다. 정렬된 범위를 넣어야 하는 알고리즘정렬된 범위를 넘겨야 원하는 효율이 나오는 알고리즘bi..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/pc3TP/btsLoEkesFH/eLjckTF5MJOK60JujJ9Fo0/img.png)
항목 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 호출 후에..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/kxlp3/btsLoEi0yvJ/XR4feL8nkjAgih4oGKVOhk/img.png)
항목 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..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/PhWsW/btsLgq0EfaG/WBljHpJGzKMRmjIPxkwRPK/img.png)
항목 28. reverse_iterator에 대응되는 베이스 반복자(base iterator)를 사용하는 방법을 정확하게 이해하자 대응되는 반복자 사용 예vector v;v.reserve(5);for(int i = 1 ; i ::reverse_iterator ri = find(v.rbegin(), v.rend(), 3); // ri는 3을 가리킨다.vector::iterator i(ri.base()); // i를 ri와 같은 곳을 가리키게 한다.이 코드 처리 후의 상황은 아래와 같다.왜 그럴까?reverse_iterator로는 삽입이나 삭제를 할 수 없다.(항목 26 참조)만약 ri로 99를 삽입하여 아래처럼 만들고 싶다고 하면..reverse_iterator를 삽입 함수에 사용할 수 없으므로 ri ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bh7eMY/btsLfXJ6fEZ/u6KA9PGHVZGh4hwmKy4nGk/img.png)
항목 27. const_iterator를 iterator로 바꾸는 데에는 distance와 advance를 사용하자 const_iterator를 iterator로 캐스팅?const_iterator는 암묵적 변환이 일어나지 않으므로 직접 바꿔주어야 한다.그렇다면 캐스팅(casting)을 쓰면 될까?using IntDeque = deque;using Iter = IntDeque::iterator;using ConstIter = IntDeque::const_iterator;IntDeque d;ConstIter ci;...Iter i(ci); // 에러 발생. 암묵적 변환은 불가능하다.Iter i2(const_cast(ci); // 여전히 에러. 캐스팅이 불가능하다.const_iterator와 iterato..