본문 바로가기

Programming

이펙티브 STL_1

[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