일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- UE4
- 반복자
- c++
- 상속
- implicit conversion
- 참조자
- operator new
- Smart Pointer
- 암시적 변환
- 게임
- resource management class
- 언리얼
- 함수 객체
- exception
- lua
- virtual function
- 영화
- 오블완
- 루아
- 영화 리뷰
- 예외
- more effective c++
- Effective c++
- 메타테이블
- reference
- 티스토리챌린지
- effective stl
- 스마트 포인터
- 다형성
- 비교 함수 객체
- Today
- Total
목록개발 (181)
스토리텔링 개발자
항목 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_..
항목 21. 연관 컨테이너용 비교 함수는 같은 값에 대해 false를 반환해야 한다 같은 값 처리set > s; // 이 경우 처리 순서를 보면..내부 데이터 구조를 뒤지면서 10B를 삽입할 위치를 찾는다.10B가 10A와 같은지 operator!(10A set은 10A와 10B가 동등하지 않다는 결론을 내린다.즉, 비교 함수가 같은 값에 false를 리턴하면 10을 다시 넣으려고 시도하게 된다.(오류)같은 값에 대해 true를 반환하는 비교함수는 모두 이런 결과를 만든다. 주의 사항operator!를 사용하는 비교 연산자 반전을 조심할 것struct StringPtrGreater{ bool operator()(const string* ps1, const string* ps2) const ..
항목 20. 포인터를 저장하는 연관 컨테이너에 대해서는 적합한 비교(비교 함수 객체) 타입을 정해주자 연관 컨테이너 문제set ssp;ssp.insert(new string("Anteater"));ssp.insert(new string("Wombat"));ssp.insert(new string("Lemur"));ssp.insert(new string("Penguin"));for(set::const_iterator i = ssp.begin() ; i != ssp.end() ; ++i){ cout set에 들어있는 값은 포인터이기에 출력물은 16진수 네 개가 한 줄씩 나올 뿐이다.아래와 같이 한다면?// ssp의 문자열을 cout으로 복사한다. 하지만..copy(ssp.begin(), ssp.end..
항목 19. 상등 관계(equality)와 동등 관계(equivalence)의 차이를 파악하자 STL 비교 동작STL의 대부분의 동작은 객체들 사이의 비교 동작이다.find(), insert()이 두 함수는 '두 값이 같은가?'를 알아내는 대표적인 함수이지만, 동작 방식이 상이하다.find상등성(equality)operator==를 사용한다.insert동등성(equivalence)operator 상등성(equality)어떤 표현식 "x == y"가 참이라고 하면 x, y는 같으며, 거짓이면 다르다.하지만, x, y가 같다고 해서 x, y의 모든 데이터 멤버가 같은 값이라는 뜻은 아니다.class Widget{public: ...private: TimeStamp lastAccessed; ..
항목 18. vector 보기를 돌같이 하자 vector의 문제점STL 컨테이너가 아니다.bool을 담고 있지도 않다. 비트(가짜 bool)로 구현되는 vectorSTL 컨테이너의 조건c가 타입 T의 객체를 담는 컨테이너라면 c에서 operator[]가 지원되어야 한다.T* p = &c[0]; // 이런 코드가 동작해야 한다.// 하지만, vector은 실제로 bool이 들어있지 않은 가짜 컨테이너라서// 아래의 코드는 동작하지 않는다.vector v;bool* pb = &v[0];vector은 공간을 줄이려고 bool을 압축시킨 데이터 표현 방식을 사용하기 때문이다.대개의 컴파일러는 bool을 하나의 비트로 구현하곤 한다.(가짜 bool값)하지만 비트필드는 참조자나 포인터로 만들 수 없다..그러므..
항목 17. 쓸데없이 남은 용량은 "바꿔치기(swap) 묘수"를 써서 없애 버리자 vector의 필요없는 메모리엄청나게 많은 요소가 들어갔다가, 한번에 줄어들면 필요없는 메모리가 벡터에 잔뜩 생긴다.이는 어떻게 처리하면 좋을까?사실, 모던 C++에서는 shrink_to_fit() 함수를 제공한다.벡터의 용량을 현재 크기만큼으로 줄이는 함수이다.string도 지원한다.하지만 이를 지원하지 않는다면 어떻게 해결해야 할까? swap 트릭class Contestant{ ... };vector contestants;...// 많은 요소를 삽입하고// 많은 요소를 제거한다....vector(contestants).swap(contestants); // shrink to fitvector(contestants)..