1. Containers

STL 컨테이너 관련 팁을 알아보자.

  1. Choose your containers with care.

STL 컨테이너는 다양하다: 연속 메모리 컨테이너, 노드 기반 컨테이너, 해시 테이블 컨테이너, 비트셋, 큐, 스택 등. 이에 기반해 어떤 컨테이너를 써야 할 지 신중하게 결정해야 한다.

2. Beware the illusion of container-independent code.

컨테이너 독립적인 코드는 쓸 수 없다. 그러나 어떤 컨테이너로 구현되었는지를 캡슐화해서 컨테이너 선택에 따른 임팩트를 최소화할 수는 있다.

3. Make copying cheap and correct for objects in containers.

컨테이너에 담는 오브젝트는 복제나 이동이 쉽도록 하라.

4. Call empty() instead of checking size() against zero.

size() == 0 체크보다는 empty()를 선호하라. 어떤 std::list 구현에서는 size()가 선형 시간일 수 있다.

5. Prefer range member functions to their single-element counterparts.

구간 내 모든 원소에 대해 적용 가능한 함수가 있다면 단일 원소에 대해 적용하는 함수를 루프로 돌리지 말고 구간에 대해 적용 가능한 함수를 사용하라. 더 효율적이고 명료하다.

6. Be alert for C++’s most vexing parse.

다음 코드는 의도대로 동작하지 않는다. list<int>라는 리턴 타입을 갖는 data라는 함수를 정의하기 때문이다.

ifstream dataFile("ints.dat");

list<int> data(istream_iterator<int>(dataFile),  // warning! this doesn't do
               istream_iterator<int>());         // what you think it does

이렇게 써라.

ifstream dataFile("ints.dat");

istream_iterator<int> dataBegin(dataFile);
istream_iterator<int> dataEnd;

list<int> data(dataBegin, dataEnd);

7. When using containers of newed pointers, remembers to delete the pointers before the container is destroyed.

컨테이너에 소유권 없는 포인터를 담았다면 그 포인터의 메모리 해제 책임은 컨테이너에 있지 않다. 컨테이너가 소멸되기 전 메모리를 해제하든가, std::unique_ptr를 담으라.

8. Never create containers of auto_ptrs.

std::auto_ptr은 삭제되었다.

9. Choose carefully among erasing options.

STL 컨테이너에서 항목을 삭제할 때는 erase-remove 관용구를 쓰거나, std::list::remove를 쓰거나, erase 멤버 함수를 쓴다. 특정 조건을 만족하는 항목을 삭제할 때는 erase-remove_if 관용구를 쓰거나, std:list::remove_if를 쓰거나, remove_copy_if 멤버 함수를 쓴다. 루프 안에서는 erase를 쓴 뒤 반환하는 반복자로 반복자를 업데이트한다.

10. Be aware of allocator conventions and restrictions.

할당자는 템플릿화하라. 할당자에 pointer, reference 타입을 T*, T&로 제공하라. 비-정적 데이터 멤버는 넣지 말라. 할당자에 건네야 하는 인자는 오브젝트의 수이지 바이트의 수가 아니다. 중첩 rebind 템플릿을 제공하라.

11. Understand the legitimate uses of custom allocators.

커스텀 할당자에 대해서는 같은 타입에 대한 할당자는 전부 등가적이어야 한다는 것을 명심하라.

12. Have realistic expectations about the thread safety of STL containers.

STL 컨테이너에 대해 복수의 동시적 읽기는 스레드 세이프하다. 서로 다른 컨테이너들에 대한 복수의 동시적 쓰기는 스레드 세이프하다. 같은 컨테이너에 대한 복수의 동시적 쓰기는 스레드 세이프하지 않다는 것을 명심하라.