据我所知,我的STL(g ++ 4.x.x附带)使用红黑树来实现地图等容器。是否可以直接使用STL的内部红黑树。如果是这样,怎么样?如果没有,为什么不 - 为什么STL不暴露红黑树?
令人惊讶的是,我无法使用谷歌找到答案。
编辑:我正在调查使用红黑树作为插入时额外的allocator构造函数调用的解决方案。见this question。我的STL使用红黑树来实现地图。
答案 0 :(得分:8)
实际上 - 答案非常简单,与您的gcc版本无关。您可以从sgi's website下载stl源代码,并亲自查看实现和使用情况。
例如,在版本3.2中,您可以在stl_tree.h文件中看到红黑树实现,以及它在stl_set.h中的使用示例。
请注意,由于stl类是模板类,因此实现实际上位于头文件中。
答案 1 :(得分:3)
您甚至不能保证所使用的数据结构 是一个红黑树(例如,它已经作为AVL树实现了至少一次,并且像B-一样, B *或B +树也可能没问题。
因此,了解内部的唯一方法是查看特定的实现,并利用它没有(至少试图)公开公开的内容。
至于原因:我认为主要是因为它是抽象的尝试,而不是暴露所有实现细节。
答案 2 :(得分:2)
我认为set
和map
的大多数STL实现都是红黑树,但没有什么能阻止某人使用不同的数据结构实现它们 - 如果我没记错的话,那么C ++标准并不需要RB树实现。
STL不公开它会违反OOP原则。如果其他人使用你的库,暴露底层数据结构可能会导致一些不良行为。也就是说,特别是对于set
和map
,您应该只允许访问符合set
和map
数据结构的方法。暴露底层表示可以可能会导致用户在set
内有重复项,这很糟糕。
话虽这么说,但据我所知,没有办法直接使用底层的红黑树......这在很大程度上取决于你想要如何使用它。实施你自己的红黑树很可能是你最好的选择,或者检查我们的第三方图书馆(也许是Boost?)