爲何C ++ STL不提供任何「樹」容器,而最好使用什麼呢? php
我想將對象的層次結構存儲爲樹,而不是將樹用做性能加強... html
海事組織,一個遺漏。 可是我認爲有充分的理由不在STL中包含Tree結構。 維護樹有不少邏輯,最好將其做爲成員函數寫入基本TreeNode
對象中 。 當TreeNode
包裝在STL標頭中時,它變得更加混亂。 node
例如: web
template <typename T> struct TreeNode { T* DATA ; // data of type T to be stored at this TreeNode vector< TreeNode<T>* > children ; // insertion logic for if an insert is asked of me. // may append to children, or may pass off to one of the child nodes void insert( T* newData ) ; } ; template <typename T> struct Tree { TreeNode<T>* root; // TREE LEVEL functions void clear() { delete root ; root=0; } void insert( T* data ) { if(root)root->insert(data); } } ;
「我想將對象的層次結構存儲爲樹」 算法
C ++ 11來了又去了,他們仍然沒有提供std::tree
,儘管這個主意確實出現了(請參閱此處 )。 也許他們之因此沒有添加它,是由於在現有容器之上構建本身的容器很是容易。 例如... 數據結構
template< typename T > struct tree_node { T t; std::vector<tree_node> children; };
一個簡單的遍歷將使用遞歸。 app
template< typename T > void tree_node<T>::walk_depth_first() const { cout<<t; for ( auto & n: children ) n.walk_depth_first(); }
若是要維護層次結構, 而且但願它與STL算法一塊兒使用 ,那麼事情可能會變得複雜。 您能夠構建本身的迭代器並實現某種兼容性,可是許多算法對層次結構根本沒有任何意義(例如,任何更改範圍順序的事物)。 即便在層次結構中定義範圍也多是一件麻煩的事。 框架
全部STL容器都可與迭代器一塊兒使用。 您不能在樹上設置迭代器,由於沒有「一種正確的」方法能夠遍歷樹。 函數
從某種意義上說,std :: map是一棵樹(要求它具備與平衡二叉樹相同的性能特徵),可是它沒有公開其餘樹功能。 不包括真實的樹數據結構的可能緣由可能只是不包含stl中全部內容的問題。 stl能夠看做是用於實現本身的算法和數據結構的框架。 性能
一般,若是您須要基本的庫功能,而stl中沒有該功能,則解決方法是查看BOOST 。