为什么C ++ STL不提供任何“树”容器,而最好使用什么呢?
我想将对象的层次结构存储为树,而不是将树用作性能增强...
#1楼
海事组织,一个遗漏。 但是我认为有充分的理由不在STL中包含Tree结构。 维护树有很多逻辑,最好将其作为成员函数写入基本TreeNode对象中 。 当TreeNode包装在STL标头中时,它变得更加混乱。
例如:
template
struct TreeNode
{
T* DATA ; // data of type T to be stored at this TreeNode
vector< TreeNode* > 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
struct Tree
{
TreeNode* 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 children;
};
一个简单的遍历将使用递归。
template< typename T >
void tree_node::walk_depth_first() const
{
cout<
for ( auto & n: children ) n.walk_depth_first();
}
如果要维护层次结构, 并且希望它与STL算法一起使用 ,那么事情可能会变得复杂。 您可以构建自己的迭代器并实现某种兼容性,但是许多算法对层次结构根本没有任何意义(例如,任何更改范围顺序的事物)。 即使在层次结构中定义范围也可能是一件麻烦的事。
#3楼
所有STL容器均可与迭代器一起使用。 您不能在树上设置迭代器,因为没有“一种正确的”方法可以遍历树。
#4楼
从某种意义上说,std :: map是一棵树(要求它具有与平衡二叉树相同的性能特征),但是它没有公开其他树功能。 不包括真实的树数据结构的可能原因可能只是不包含stl中所有内容的问题。 stl可以看作是用于实现自己的算法和数据结构的框架。
通常,如果您需要基本的库功能,而stl中没有该功能,则解决方法是查看BOOST 。
否则,有一个一堆的库 了 那里 ,这取决于你的树的需求。
#5楼
std :: map基于一棵红黑树 。 您还可以使用其他容器来帮助您实现自己的树类型。