为什么C++STL不提供任何容器?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (10)
  • 关注 (0)
  • 查看 (355)

为什么C++STL不提供任何“tree”容器,最好使用什么?

我想将对象的层次结构存储为树,而不是使用tree作为性能增强...

提问于
用户回答回答于

有两个原因可以让你想要使用tree:

你需要使用类似tree的结构来反映问题:

或者你需要一个具有类似树的访问特性的容器。

基本上,这两个容器的特性使得它们实际上必须使用树来实现(尽管这实际上不是一个要求)。

用户回答回答于
用户回答回答于

因为STL不是一个“everything”的库。从本质上讲,它包含了构建事物所需的最小结构。

用户回答回答于

所有STL容器外部表示为具有一个迭代机制的“sequences”。树不遵循这个成语。

用户回答回答于

在某种程度上,std :: map是一个树(它需要与平衡二叉树具有相同的性能特征),但是它不公开其他树功能。 不包括真正的树数据结构的可能原因可能仅仅是不包括stl中的所有内容。 stl可以看作一个框架,用于实现自己的算法和数据结构。

一般来说,如果你需要一个基本的库函数,那不在stl中,修正就是看BOOST

用户回答回答于

地图是基于 red black tree.你也可以使用其他containers来帮助你实现自己的tree类型。

用户回答回答于
用户回答回答于

“我想将对象的层次结构存储为tree”

在现有容器的基础上构建自己的工具非常简单,例如..

template< typename T >
struct tree_node
   {
   T t;
   std::vector<tree_node> children;
   };

简单的遍历会使用递归..。

template< typename T >
void tree_node<T>::walk_depth_first() const
   {
   cout<<t;
   for ( auto & n: children ) n.walk_depth_first();
   }

如果你想维护层次结构你想让它和STL算法事情就会变得复杂起来。你可以构建自己的迭代器并实现一些兼容性,但是许多算法对层次结构没有任何意义。平定义等级结构中的范围可能是一项杂乱无章的工作。

用户回答回答于

STL的理念是,你选择容器是基于保证而不是基于容器的实现方式。例如,你对容器的选择可能基于对快速查找的需求。尽管您很关心,容器可能会实现为一个单向列表。这是因为您没有触及内部,而是使用迭代器或成员函数进行访问。你的代码并不绑定到容器是如何实现的,而是与容器的实现速度有关

用户回答回答于

可能是因为Boost中没有树容器的原因。实现这样一个容器的方法有很多,而且没有一个好的方法来满足每个使用它的人。

需要考虑的一些问题:

  • 节点的子节点数量是固定的还是可变的?
  • 每个节点的开销是多少?-例如,你需要家长指点,兄弟姐妹指点,等等。
  • 提供什么算法?-不同的迭代器、搜索算法等。

最后,问题是一个对每个人都有用的树容器太重了,无法满足大多数使用它的人的需要。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励