为何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 。