일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 비교 함수 객체
- exception
- 참조자
- 다형성
- 게임
- 티스토리챌린지
- c++
- 루아
- virtual function
- Effective c++
- 반복자
- 예외
- UE4
- 오블완
- 영화 리뷰
- 메타테이블
- Smart Pointer
- operator new
- 상속
- 스마트 포인터
- resource management class
- reference
- 언리얼
- lua
- 영화
- implicit conversion
- Vector
- more effective c++
- effective stl
- 암시적 변환
- Today
- Total
목록개발/Effective STL (45)
스토리텔링 개발자
항목 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..
항목 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 ..
항목 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..
항목 26. const_iterator나 reverse_iterator, const_reverse_iterator도 좋지만 역시 쓸만한 것은 iterator이다 iterator들의 관계vector에서 제공되는 함수들을 우선 보도록 하자.iterator insert(iterator position, const T& x);iterator erase(iterator position);iterator erase(iterator rangeBegin, iterator rangeEnd);모두 iterator를 매개변수로 받아들인다.이제, 네 가지 반복자 사이의 상호 변환 관계를 그림으로 보도록 하자.const_iterator가 iterator로, const_reverse_iterator가 reverse_itera..
항목 25. 해쉬 컨테이너에 대해 충분히 대비해 두자 C++11 이전의 해쉬 테이블STL에는 해쉬 연관 컨테이너가 포함되지 않았다.C++11 이후에는 unordered_set, unordered_map이 추가되었다.이 책은 모던 C++이 나오기 전이므로 표준이 아닌 해쉬 컨테이너를 기준으로 설명하고 있다.표준이기 전에 가장 대표적으로 쓰이던 것은 SGI과 딩컴웨어(Dinkumware)의 해쉬 컨테이너이다. 해쉬 컨테이너다른 연관 컨테이너와 대부분 동일하다.허나, 해쉬 컨테이너는 해쉬 함수(hashing function)을 지정해야 한다.// 해쉬 컨테이너의 일반적인 형태template >class hash_container;// SGI 버전의 hash_set의 형태// 해쉬 함수와 비교 함수에 대..
항목 24. map::operator[]나 map::insert는 효율 문제에 주의하여 선택하자 operator[] 대신 insert를 써야할 때class Widget{public: Widget(); Widget(double weight); Widget& operator=(double weight); ...};map m;m[1] = 1.50;m[2] = 3.67;m[3] = 10.5;m[4] = 45.8;m[5] = 0.0003; // 심각한 수행 성능 저하!map::operator[]는 추가 혹은 갱신(add or update) 기능을 수행하도록 설계되었다.즉, m[k] = v; 시해당 맵에 키 k가 있는지 점검없다면 k와 v가 페어로 묶여서 맵에 새로 추가있다면 k와 매핑된 ..
항목 23. 연관 컨테이너 대신에 정렬된 vector를 쓰는 것이 좋을 때가 있다 빠른 데이터 검색을 하고 싶다보통은 연관 컨테이너를 생각하게 된다.그 중 해시 컨테이너를 선택하는 것이 좋다.(항목 25 참조)map(로그 시간), hashmap(상수 시간)탐색이 로그 시간 정도가 적당하다고 판단했더라도, 연관 컨테이너보단 벡터가 나을 수 있다. 균형 이진 탐색 트리(balanced binary search tree)데이터 노드의 삽입, 삭제, 탐색이 언제 이루어질지 예측할 수 없는 상황에 적합한 자료구조.어떤 식으로 사용해도 안정적인 성능을 보여준다.즉, 삽입, 삭제, 탐색의 수행이 일정한 순서를 따르지 않으며, 다음에 어떤 동작이 이루어질 지 예측할 수 없더라도 안정적인 성능을 보장한다.하지만 ..
항목 22. set과 multiset에 저장된 데이터 요소에 대해 키(key)를 바꾸는 일은 피하자 이유set과 multiset은 요소를 정렬해서 관리하며, 정렬됨을 간주하고 동작한다.임의로 값을 바꾸면 그 정렬이 올바를 리가 없기 때문이므로 임의로 키값을 바꾸면 안 된다.어차피 모던 c++에서는 set은 cbegin만 지원하므로 const가 아닌 요소에 접근하기 쉽지 않다.std::set::begin 참조 map에서는?map m;...m.begin()->first = 10; // 컴파일 에러multimap mm;...mm.begin()->first = 20; // 역시 컴파일 에러map, multimap은 애초에 pairconst K, V> 값을 저장하기 때문에 변경할 수 없다.물론 const_..