[Effective STL] 2006스콧 마이어스 저
" C++ 표준 템플릿 라이브러리를 효과적으로 활용하는 50가지의 명쾌한 테크닉 모음
1. 적재적소에 알맞은 컨테이너를 사용하자
표준 STL 시퀀스 컨테이너 : vector, string, deque, list
표준 STL 연관 컨테이너 : set, multiset, map, multimap
비표준 연관 컨테이너 : hash_set, hash_multiset, hash_map
등..
연속 메모리 컨테이너 : 연속된 메모리 공간에 요소들을 저장
노드 기반 컨테이너 : 메모리 공간들이 포인터로 서로 연결되어 있음
2. 컨테이너에 독립적인 코드라는 환상을 조심하자
: vector 쓰는 자리에 list를 써도 되도록 짜는 것
: 고유 함수를 사용하지 못할 수도 있고 캡슐화를 한다 해도 효율성이 떨어질 수 있다
3. 복사는 컨테이너 안의 객체에 맞게 비용은 최소화하며, 동작은 정확하게 하자.
: 컨테이너에 들어가는 것은 그 객체의 복사본이다.
: 때문에 복사 비용이 들어간다.
4. size()의 결과를 0과 비교할 생각이라면 차라리 empty를 호출하자
: size()함수 호출할 때 순회비용이 드는 경우가 있다. (ex list)
: list 는 splice 함수 때문에 매번 순회하며 사이즈 계산에 정확도를 높인다.
5. 단일 요소를 단위로 동작하는 맴버함수보다 요소의 범위를 단위로 동작하는 맴버 함수가 더 낫다.
: v1 백터 반을 v2 백터 반과 똑같이 하는 방법은?
: v1.assign(v2.begin() + v2.size()/2. v2.end())
: insert를 n번 부르지 않고 1번으로 끝난다(????)
: 백터는 요소를 앞쪽에 추가하면 밀어내기 비용이 들어간다. 하지만 범위 버전의 insert는 요소를 마지막 위치로 바로 옮기도록 되어 있다.(????)
6. 컴파일러의 어이없는 분석 결과를 조심하자
: 객체 생성을 함수 선언으로 분석하는 경우가 있다.
: list<int> data(istream_iterator<int>(dataFile), istream_iterator<int>()) < - 함수 선언으로 인식
: list<int> data((istream_iterator<int>(dataFile)), istream_iterator<int>()) <- 객체 생성으로 인식
'Programming' 카테고리의 다른 글
이펙티브 STL_3 (0) | 2021.03.07 |
---|---|
이펙티브 STL_2 (0) | 2021.02.07 |
이펙티브 모던 C++_8 (0) | 2020.12.20 |
이펙티브 모던 C++_7 (0) | 2020.12.13 |
이펙티브 모던 C++_6 (0) | 2020.12.06 |