使用STL内部实现的红黑树

Using STL's Internal Implementation of Red-Black Tree

本文关键字:实现 STL 内部 使用      更新时间:2023-10-16

我知道我的STL(g++4.x.x附带)使用红黑树来实现映射等容器。是否可以直接使用STL的内部红黑树。如果是,如何?如果没有,为什么不?为什么STL不暴露红黑树?

令人惊讶的是,我在谷歌上找不到答案。

编辑:我正在研究使用红黑树作为插入时额外分配器构造函数调用的解决方案。请参阅此问题。我的STL使用红黑树来实现映射。

事实上,答案非常简单,与您的gcc版本无关。您可以从sgi的网站下载stl源代码,并亲自查看实现和使用。

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

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

我相信setmap的大多数STL实现都是红黑树,尽管没有什么能阻止人们使用不同的数据结构来实现它们——如果我没记错的话,C++标准不需要RB树实现。

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

话虽如此,(据我所知)没有办法直接使用下面的红黑树。。这在很大程度上取决于你想如何使用它。实现你自己的红黑树很可能是你的最佳选择,或者查看我们的第三方库(也许是Boost?)

您甚至不能保证所使用的数据结构将是红黑树(例如,它至少作为AVL树实现过一次,类似B-、B*或B+树的东西可能也可以)。

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

至于原因:我认为主要是因为这是一种抽象的尝试,而不是公开所有的实现细节。