-
해쉬 연관 컨테이너(hashed associative containers)
hash_set, hash_multiset, hash_map, hash_multimap이 여기에 속합니다. 자세한 정보는 항목 25를 참고하세요.
-
단일 연결 리스트 컨테이너(singly linked list container)
slist입니다. 여러분이 상상한 대로 구현되었고, 역시 가리켜질 것 같은 리스트 노드를 반복자가 가리키고 있습니다.
안타까운 점은 insert와 erase 멤버 함수의 동작이 상당히 느리다는 것인데, 반복자가 가리키는 노드의 앞에 있는 노드의 포인터를 조정해야 하기 때문입니다.
단일 연결 리스트에서는 뒤의 노드로 이동할 때 선형 시간이 소요됩니다(앞에서부터 다시 와야 하니까요).
SGI는 이 문제를 비표준 멤버 함수인 insert_after 와 erase_after(이 함수들은 상수 시간에 동작 합니다)를 통해 해결하려고 했습니다.
이런 멤버 함수를 쓰는것이 불만이고 insert와 erase를 자주 쓰시는 분은 slist 대신에 list를 쓰셔야 할 것입니다.
딩컴웨어(Dinkumware)에서도 slist란 똑같은 이름의 단일 연결 리스트 컨테이너를 지원합니다. 하지만 이 컨테이너의 반복자는 조금 다르게 구현되었기
때문에 insert와 erase의 수행 성능이 그대로 상수 시간입니다(딩컴웨어에 대한 자세한 내용은 부록 B 를 참고하세요).
-
매우 긴 문자열을 담을 수 있는 string 류의 컨테이너(string-like container for very large strings)
이 컨테이너는 rope(로프) 라고 불립니다. SGI는 로프를 이렇게 규정하고 있습니다.
로프는 확장성을 갖춘 문자열 객체로서, 문자열 전체를 대상으로 한 동작에 최적화시켜 설계되었습니다. 문자열 대입, 문자열 연결, 부분 문자열 연산 등이
문자열의 길이에 거의 상관없는 속도로 수행됩니다. C 문자열과 달리, 로프는 매우 긴 문자열을 표한하는데 적합한 구조로서, 편집기 버퍼나 메일 메시지를
구현 하는데 효과적입니다.
속을 살짝 들추어 보면, rope는 참조 카운팅으로 관리하는 부분 문자열의 트리로 구현되어 있습니다. 그리고 각 부분 문자열은 char 배열로서 저장되어
있지요.
로프 인터페이스의 재미있는 특징은 begin과 end 함수가 무조건 const_iterator를 반환한다는 점입니다. 애초부터 rope는 문자열 전체를
다루는 동작에 최적화된 클래스이기 때문에 문자를 하나씩 바꾸는 동작은 비용이 꽤 높습니다.
-
다양한 비표준 함수자 객체와 어댑터들
가장 처음에 발표된 HP의 STL에는 현재의 표준 C++에 있는 것 이외의 함수자 클래스가 더 많이 들어 있었습니다. 이들 중에 많은 초창기 STL 고수들이
아쉬워 했던 두 가지가 select1st와 select2nd입니다. map과 multimap으로 작업할 때 매우 편리했기 때문입니다.
어떤 pair가 있을 때, select1st는 첫째 멤버(키)를 반환하고 select2nd는 둘째 멤버(값)을 반환합니다. 이렇게 사용할 수 있지요.
예제 코드 보기
- map<int, string> m;
-
- ...
-
- transform(m.begin(), m.end(),
- ostream_iterator<int>(cout, "\n"),
- select1st<map<int, string>::value_type>());
-
- vector<string> v;
- transform(m.begin(), m.end(), back_inserter(v),
- select2nd<map<int, string>::value_type>());
-
예제 코드 접기
보다시피, select1st와 select2nd가 없었다면 앞의 코드에서 여러분은 간단한 알고리즘 대신에 루프를 직접 만드는게 편했을
것입니다(항목 43 참조).
하지만 이 함수자가 표준이 아니라는 사실은 이것을 사용한 여러분의 코드가 유지보수성이나 이식성에서 떨어질 거라는 뜻도
됩니다(항목 47 참조).
SGI가 구현한 비표준 함수 객체는 이외에도 identity, project1st, project2nd, compose1, compose2 등이 있습니다.
항목 43에서 compose2를 사용한 예제를 보셨겠지만 자세한 사항은 웹 사이트를 직접 방문하셔서 알아보는 것이 좋겠네요.