使用 STL 内部实现的红黑树
Posted
技术标签:
【中文标题】使用 STL 内部实现的红黑树【英文标题】:Using STL's Internal Implementation of Red-Black Tree 【发布时间】:2012-07-08 00:45:09 【问题描述】:我了解我的 STL(与 g++ 4.x.x 一起提供)使用红黑树来实现地图等容器。是否可以直接使用STL内部的红黑树。如果是这样,怎么做?如果不是,为什么不——为什么 STL 不暴露红黑树?
令人惊讶的是,我无法使用谷歌找到答案。
编辑:我正在研究使用红黑树作为插入时额外分配器构造函数调用的解决方案。见this question。我的 STL 使用红黑树来实现地图。
【问题讨论】:
“我正在研究使用红黑树作为插入时额外分配器构造函数调用的解决方案。”一个适当的解决方案是使用不具有此属性的标准容器的实现。 C++11 需要有状态的分配器,因此任何正确支持 C++11 特性的标准库都会有更合理的行为(尽管它仍然会构造不同的分配器实例,但它只会从原始分配器对象中这样做)。跨度> @Prasoon - 这里对你没有帮助,因为无论如何构造函数调用的是底层树实现。尝试比 gcc 4.1 更新的编译器是一种选择(上一个问题Custom memory allocator for STL map) 【参考方案1】:实际上 - 答案非常简单,并且与您的 gcc 版本无关。可以从sgi's website下载stl源码,自己看实现和使用。
例如,在3.2版本中,可以在stl_tree.h文件中看到红黑树的实现,在stl_set.h中有一个使用示例。
请注意,由于 stl 类是模板类,因此实现实际上在头文件中。
【讨论】:
我认为您使用的链接已过时,因为它会将我引导至 Hewitt Packaging 的网站。【参考方案2】:我相信set
和 map
的大多数 STL 实现都是红黑树,尽管没有什么能阻止人们使用不同的数据结构来实现它们——如果我没记错的话,C++ 标准不需要 RB 树实现.
STL 不会公开它,因为这会违反 OOP 原则。如果其他人要使用您的库,公开底层数据结构可能会导致一些不良行为。也就是说,特别是对于set
和map
,您应该只被允许访问符合set
和map
数据结构的方法。暴露底层表示可能会导致用户在内部有重复set
,这很糟糕。
话虽如此,(据我所知)无法直接使用底层的红黑树。这在很大程度上取决于您希望如何使用它。实现您自己的红黑树很可能是您最好的选择,或者查看我们的 3rd 方库(也许是 Boost?)
【讨论】:
【参考方案3】:您甚至无法保证所使用的数据结构将是一棵红黑树(例如,它至少被实现过一次作为 AVL 树,以及类似 B-、 B* 或 B+ 树可能也可以)。
因此,了解内部结构的唯一方法是查看特定的实现,并利用它不(至少尝试)公开的东西。
至于为什么:我认为主要是因为它是一种抽象的尝试,而不是暴露所有的实现细节。
【讨论】:
以上是关于使用 STL 内部实现的红黑树的主要内容,如果未能解决你的问题,请参考以下文章
[C/C++]详解STL容器9-基于红黑树模拟实现map和set
[C/C++]详解STL容器9-基于红黑树模拟实现map和set