爲何C ++ STL不提供任何「樹」容器?

爲何C ++ STL不提供任何「樹」容器,而最好使用什麼呢? php

我想將對象的層次結構存儲爲樹,而不是將樹用做性能加強... html


#1樓

海事組織,一個遺漏。 可是我認爲有充分的理由不在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); } 
} ;

#2樓

「我想將對象的層次結構存儲爲樹」 算法

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算法一塊兒使用 ,那麼事情可能會變得複雜。 您能夠構建本身的迭代器並實現某種兼容性,可是許多算法對層次結構根本沒有任何意義(例如,任何更改範圍順序的事物)。 即便在層次結構中定義範圍也多是一件麻煩的事。 框架


#3樓

全部STL容器都可與迭代器一塊兒使用。 您不能在樹上設置迭代器,由於沒有「一種正確的」方法能夠遍歷樹。 函數


#4樓

從某種意義上說,std :: map是一棵樹(要求它具備與平衡二叉樹相同的性能特徵),可是它沒有公開其餘樹功能。 不包括真實的樹數據結構的可能緣由可能只是不包含stl中全部內容的問題。 stl能夠看做是用於實現本身的算法和數據結構的框架。 性能

一般,若是您須要基本的庫功能,而stl中沒有該功能,則解決方法是查看BOOST

不然,有一個一堆 那裏 ,這取決於你的樹的需求。


#5樓

std :: map基於一棵紅黑樹 。 您還可使用其餘容器來幫助您實現本身的樹類型。

相關文章
相關標籤/搜索