使用STL的红黑树的内部实现

时间:2012-07-08 06:28:30

标签: c++ stl tree red-black-tree

据我所知,我的STL(g ++ 4.x.x附带)使用红黑树来实现地图等容器。是否可以直接使用STL的内部红黑树。如果是这样,怎么样?如果没有,为什么不 - 为什么STL不暴露红黑树?

令人惊讶的是,我无法使用谷歌找到答案。

编辑:我正在调查使用红黑树作为插入时额外的allocator构造函数调用的解决方案。见this question。我的STL使用红黑树来实现地图。

3 个答案:

答案 0 :(得分:8)

实际上 - 答案非常简单,与您的gcc版本无关。您可以从sgi's website下载stl源代码,并亲自查看实现和使用情况。

例如,在版本3.2中,您可以在stl_tree.h文件中看到红黑树实现,以及它在stl_set.h中的使用示例。

请注意,由于stl类是模板类,因此实现实际上位于头文件中。

答案 1 :(得分:3)

您甚至不能保证所使用的数据结构 是一个红黑树(例如,它已经作为AVL树实现了至少一次,并且像B-一样, B *或B +树也可能没问题。

因此,了解内部的唯一方法是查看特定的实现,并利用它没有(至少试图)公开公开的内容。

至于原因:我认为主要是因为它是抽象的尝试,而不是暴露所有实现细节。

答案 2 :(得分:2)

我认为setmap的大多数STL实现都是红黑树,但没有什么能阻止某人使用不同的数据结构实现它们 - 如果我没记错的话,那么C ++标准并不需要RB树实现。

STL不公开它会违反OOP原则。如果其他人使用你的库,暴露底层数据结构可能会导致一些不良行为。也就是说,特别是对于setmap,您应该只允许访问符合setmap数据结构的方法。暴露底层表示可以可能会导致用户在set内有重复项,这很糟糕。

话虽这么说,但据我所知,没有办法直接使用底层的红黑树......这在很大程度上取决于你想要如何使用它。实施你自己的红黑树很可能是你最好的选择,或者检查我们的第三方图书馆(也许是Boost?)