블로그 이미지
이태원에서 사는 다섯식구의 무직 가장. 흰둥에미

카테고리

분류 전체보기 (184)
Itaewon (2)
ryu's?? (1)
20121210이전 (20)
20130827이전 (147)
soo'study (13)
Total34,023
Today5
Yesterday5

항목4. size()의 결과를 0과 비교할 생각이라면 차라리 empty를 호출하자.

- empty는 모든 표준 컨테이너에 대해 상수 시간에 수행되지만, 몇몇 제품에서 구현된 list 클래스에서 size가 선형 시간에 수행됨.

  list의 splice란 유용한 함수의 상수 시간 동작을 위해, size를 구할 때 매번 요소들의 개수를 카운트 하게 구현된 경우가 있음.


항목5. 단일 요소를 단위로 동작하는 멤버 함수보다, 요소의 범위를 단위로 동작하는 멤버 함수가 더 낫다.

- v1.assign(v2.begin()+v2.size()/2, v2.end()); --> v1을 v2의 뒤쪽 절반과 똑같이 만드는 코드.

  assign이라는 함수는 표준 시퀀스 컨테이너(vector, string, deque, list)라면 모두 사용 가능.

  컨테이너의 내용을 완전히 교체하고 싶다면 assign을 떠올리면 좋음.

  범위 멤버 함수를 사용하지 않고, 위의 코드를 작성하기 위해선 루프가 필요해짐.

  삽입 연산자(inserter, back_inserter, front_inserter)를 사용해서 복사 범위를 지정하는 copy는 거의 모두 범위 멤버 함수로 변경가능.

  copy(v2.begin() + v2.size() / 2, v2.end(), back_inserter(v1)); --> v1.insert(v1.end(), v2.begin() + v2.size() / 2, v2.end());

  위와 같이 범위 멤버 함수를 사용하면 코드가 대개 짧고, 명확하고 간결한 의미를 전달함.

  vector의 경우 범위 함수가 아닌 단일 요소 버전의 함수를 사용할 경우,

  1. 불필요한 함수 호출의 증가, 2. 매번 갱신되는 컨테이너내의 메모리 이동, 3. 메모리 할당(vector의 내부 복사 동작.)

  위 세가지 단점이 있다. 그 외의 표준 시퀀스 컨테이너들도, 모두는 아니지만 특정 단점을 물고 들어가게 되므로 범위 함수를 사용하자.

  효율을 떠나서도, 간결한 코드는 유지 보수성을 높여줄 수 있음.

  - 범위 생성

  - 범위 삽입

  - 범위 삭제

  - 범위 대입

신고
Posted by 흰둥에미

- STL은 반복자, 알고리즘, 함수 객체 등을 모아 놓은 것. (컨테이너도 있음)

항목 1. 적재적소에 알맞은 컨테이너를 사용하자

  - 표준 STL 시퀀스 컨테이너 : vector, string, deque, list

    표준 STL 연관 컨테이너 : set, multiset, map, multimap

    비표준 시퀀스 컨테이너 : slist(단일 연결 리스트)와 rope(대용량 string)

    비표준 연관 컨테이너 : hash_set, hash_multiset, hash_map, hash_multimap

                                    표준 연관 컨테이너를 확장하여 해쉬 테이블을 쓸 수 있도록 한 변형 클래스가 많이 있음.

    string 대신 사용되는 vector<char>

    표준 연관 컨테이너 대신 사용되는 vector : vector가 수행 속도나 크기 면에서 표준 연관 컨테이너보다 나은 경우가 있음.

    STL에 속하지 않는 표준 컨테이너 : 배열(C++배열), bitset, valarray, stack, queue, priority_queue

                                                    STL컨테이너 보다 배열이 더 나은 경우

                                                    vector<boo>대신 bitset을 써야 하는 이유

                                                    C++배열은 STL알고리즘과 문제없이 사용 가능(배열의 반복자로 포인터를 쓸 수 있음)


  - 연속 메모리 컨테이너(배열 기반) : 각 메모리 단위(chunk)는 하나 이상의 요소를 담고 있음.

                                                    삽입, 삭제에 의해 같은 메모리 단위에 있는 다른 요소들은 앞 혹은 뒤로 밀려남.

                                                    이러한 밀어내기는 수행 성능에 발목을 잡고, 예외 안전성에도 영향을 미침

                                                    vector, string, deque, rope

    노드 기반 컨테이너 : 동적 할당된 하나의 메모리 단위에다가 하나의 요소만을 지정

                                  list나 slist가 노드 기반, 표준 연관 컨테이너 모두(전형적으로 균형 트리로 구현)

                                  비표준인 해쉬 컨테이너도 노드 기반


  - 컨테이너의 선택시 고려 사항

    1. 랜덤 액세스가 가능해야 한다면 시퀀스 컨테이너

    2. 컨테이너 내의 요소들의 순서 결정에 직접 관여하고 싶다면, 해쉬 컨테이너는 피해야 함.

    3. 표준 C++에 포함된 컨테이너를 원한다면, 해쉬 컨테이너, slist, rope는 쓸 수 없음.

    4. 임의 접근 반복자가 필요하다면 vector, deque, string, rope를 쓰고, 양방향 반복자가 필요하면 slist, 해쉬 컨테이너는 피해야 함.

    5. 요소 삽입 삭제시 다른 컨테이너 요소들이 밀려나는 일이 없어야 한다면, 연속 메모리 컨테이너는 피해야 함.

    6. 컨테이너 내의 데이터가 C의 데이터 타입과 메모리 배열에 구조적으로 호환되어야 한다면, vector 뿐

    7. 탐색 속도가 중요하다면, 해쉬 컨테이너, 정렬된 vector, 표준 연관 컨테이너 순으로 고려해 볼 것.

    8. 컨테이너의 참조 카운팅이 신경쓰인다면, string, rope를 피하고, vector<char>로 대신 할 것.

    9. 트랜잭션적인 삽입, 삭제가 여러 개의 요소에 대해 이루어져야 한다면, list를 선택.

       트랜잭션적인 동작은 예외 안전성을 추가하는데 중요.

   10. 반복자, 포인터, 참조자가 무효화되는 일을 최소화하려면, 노드 기반 컨테이너를 선택

   11. 임의 접근 반복자를 지원하는 시퀀스 컨테이너이면서, 요소 삭제가 일어나지 않고 요소 삽입이 컨테이너의 끝에서만 일어나는 한,

       포인터와 참조자가 무효화되지 않는 것은 deque(요소 삽입이 끝에서 일어날 때 반복자만 무효화 됨.)


신고
Posted by 흰둥에미

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

티스토리 툴바