为何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基于一棵红黑树 。 您还可使用其余容器来帮助您实现本身的树类型。

相关文章
相关标签/搜索