2012-11-07 2 views
5

STL 구현을위한 몇 가지 소스 (SGI, STLport, libC++)를보고 모든 디자인 또는 대부분의 구현에 공통적 인 몇 가지 디자인 패턴을 보았지만 아무 이유도 찾을 수 없습니다. 예를 들어,이 개 클래스로 구현하고, 다른 사람의 사이에서 vectorlist_iterator 포함STL의 설계 원리

  1. 많은 클래스 : 나는 거기에 좋은 RESON, 그리고 그것이 무엇인지 알고 싶어한다 가정 기능 중 일부가 포함 된 list_iterator_base, 나머지 인터페이스와 함께 list_iterator_base을 상속하는 list_iterator. 요점이 뭐야? 한 클래스에서 쉽게 할 수있는 것처럼 보입니다.

  2. 반복기는 iterator 클래스를 사용하지 않는 것처럼 보입니다. 그것을 사용하는 데 약간의 성능상의 불이익이 있습니까?

두 가지 질문이 있습니다. 누구든지 STL 구현의 구현 근거를 설명하는 훌륭한 자료를 알고 있다면 기쁜 마음으로 알게 될 것입니다.

+0

"점보 새우". –

+0

기술적으로 STL과 표준 라이브러리 (stdlib)는 다릅니다. 후자는 대부분 공식 언어 표준에 추가되었을 때 전자에서 파생되었습니다. 거의 모든 사람이 "참"STL을 더 이상 사용하지 않지만 대신 표준 라이브러리 (예 : libC++)의 구현을 사용합니다. 많은 사람들이 stdlib을 STL이라고 부르지 만 괜찮습니다.하지만 질문에 대한 차이는 의미를 변경합니다. – GManNickG

+0

@DaveNewton 귀하의 의견을 이해할 수 없습니다. – baruch

답변

7

대답은 정직하고 공정하게됩니다

  1. STL 모든 제네릭 프로그래밍에 관한 것입니다. 핵심 아이디어는 중복 된 코드를 작성하는 것이 아닙니다. 즉각적인 목표는 소스 코드가 중복되지 않도록하는 것이지만, 바이너리 코드를 중복하지 않는 것이 좋습니다. 따라서 STL 구성 요소는 일반적으로 사용되는 부품을 사용하여이를 사용하는 것이 일반적입니다. 목록 클래스 또는 벡터의 유형 독립 속성에 대한 링크는 두 가지 예일뿐입니다. 벡터의 경우 여러 부분이 있습니다. 일부는 유형 (예 : 크기)과 완전히 독립적이며, 다른 일부는 유형 자체 만 필요합니다 (예 : 모든 접근 자, 반복자 등). 리소스 할당 (예 : 삽입 및 삭제에 사용되는 할당 자에 대해 알아야 함)을 처리합니다.
  2. std::iterator<...>은 실제로 작동하지 않습니다. 템플릿 매개 변수에 따라 기본 클래스에 정의 된 유형은 이러한 기본 클래스에서 파생되는 클래스 템플릿에서 직접 액세스 할 수 없습니다. 즉, 형식은 기본 클래스로 정규화되어야하고 typename을 사용하는 형식으로 표시해야합니다. 설상가상으로 사용자는 파생 클래스의 객체를 이론적으로 할당하여 std::iterator<...>에 대한 포인터를 통해 배포 할 수 있습니다 (예, 바보 같은 짓입니다). 즉, 이점은 없지만 잠재적 인 단점이있다. 즉, 가장 바람직하게 피할 수있다.

그렇긴하지만 일반 라이브러리를 구현하는 기술을 다루는 훌륭한 리소스를 알지 못합니다. STL 구현에 적용된 대부분의 세부 사항은 여러 사람이 독자적으로 발명했지만 Generic Programming에 대한 문헌은 아직 부족합니다. 나는 STL을 설명하는 어떤 논문도 실제로 구현 기술을 논의하지 않는다고 생각한다. 그들은 보통 설계 세부 사항에 집중한다. 아주 소수의 사람들 만이 STL에 대해 이해하고있는 것을 감안할 때 작성자가 STL을 구현하는 방법보다는 STL을 설명하는 데 집중하는 경향이 크다는 사실이 놀랍지 않습니다.

+0

2 점 : 작동하지 않는다면 왜 계속 사용합니까? 왜 표준 라이브러리에 추가 되었습니까? – baruch