STL 트리가없는 데는 몇 가지 이유가 있다고 생각합니다. 기본적으로 트리는 컨테이너 (리스트, 벡터, 세트)와 같이 재귀 데이터 구조의 형태로, 정확한 선택을 어렵게하는 매우 다른 미세 구조를 갖습니다. 또한 STL을 사용하여 기본 형식으로 구성하기가 매우 쉽습니다.
유한 루트 트리는 값 또는 페이로드를 갖는 컨테이너, 클래스 A의 인스턴스, 그리고 아마도 비어있는 루트 (서브) 트리 컬렉션으로 생각할 수 있습니다. 하위 트리의 빈 컬렉션이있는 나무는 나뭇잎으로 간주됩니다.
template<class A>
struct unordered_tree : std::set<unordered_tree>, A
{};
template<class A>
struct b_tree : std::vector<b_tree>, A
{};
template<class A>
struct planar_tree : std::list<planar_tree>, A
{};
반복자 디자인 등에 대해 약간 생각하고 나무 사이에서 정의하고 효율적으로 사용할 수있는 제품 및 공동 제품 작업-원본 STL을 잘 작성해야하므로 빈 세트, 벡터 또는 목록 컨테이너가 기본 경우 페이로드가 실제로 비어 있습니다.
나무는 많은 수학적 구조에서 중요한 역할을합니다 (정육점, 그로스 만 (Grossman) 및 라슨 (Larsen)의 고전 논문, 또한 합류 할 수있는 사례에 대한 Connes와 Kriemer의 논문 및 열거에 사용되는 방법 참조). 그들의 역할이 단순히 다른 작업을 용이하게하는 것이라고 생각하는 것은 옳지 않습니다. 오히려 데이터 구조로서의 기본 역할로 인해 이러한 작업을 용이하게합니다.
그러나 나무 외에 "공동 나무"도 있습니다. 위의 모든 나무는 루트를 삭제하면 모든 것을 삭제하는 속성을 갖습니다.
트리의 반복자를 고려하십시오. 아마도 그들은 반복자, 노드 및 상위 노드까지 루트까지의 간단한 스택으로 실현 될 것입니다.
template<class TREE>
struct node_iterator : std::stack<TREE::iterator>{
operator*() {return *back();}
...};
그러나 원하는만큼 가질 수 있습니다. 집합 적으로 그들은 "트리"를 형성하지만 모든 화살표가 루트 방향으로 흐르면이 코트 리는 반복자를 통해 사소한 반복기와 루트로 반복 될 수 있습니다. 그러나 모든 인스턴스를 추적하지 않는 한 반복하거나 다른 탐색자를 알 수 없으며 반복자의 앙상블을 삭제할 수 없습니다.
나무는 엄청나게 유용하고 구조가 많기 때문에 결정적으로 올바른 접근 방법을 얻는 것이 심각한 도전입니다. 제 생각에는 이것이 STL에서 구현되지 않은 이유입니다. 또한 과거에는 사람들이 종교적으로 이해하고 자신의 유형의 인스턴스를 포함하는 컨테이너 유형에 대한 아이디어를 찾는 것을 보았습니다. 그러나 그들은 직면해야합니다. 아마도 (더 작은) 나무의 빈 컬렉션입니다. 현재 언어는 기본 생성자를 제공하는 데 어려움없이 언어를 허용합니다 container<B>
.B
등
이것이 좋은 형태로 표준에 도달하면 기뻐할 것입니다.