使用STL内部实现的红黑树
Using STL's Internal Implementation of Red-Black Tree
我知道我的STL(g++4.x.x附带)使用红黑树来实现映射等容器。是否可以直接使用STL的内部红黑树。如果是,如何?如果没有,为什么不?为什么STL不暴露红黑树?
令人惊讶的是,我在谷歌上找不到答案。
编辑:我正在研究使用红黑树作为插入时额外分配器构造函数调用的解决方案。请参阅此问题。我的STL使用红黑树来实现映射。
事实上,答案非常简单,与您的gcc版本无关。您可以从sgi的网站下载stl源代码,并亲自查看实现和使用。
例如,在3.2版本中,您可以在stl_tree.h文件中看到红黑树的实现,以及它在stl_set.h中的使用示例。
请注意,由于stl类是模板类,因此实现实际上在头文件中。
我相信set
和map
的大多数STL实现都是红黑树,尽管没有什么能阻止人们使用不同的数据结构来实现它们——如果我没记错的话,C++标准不需要RB树实现。
STL没有公开它,因为这会违反OOP原则。。如果其他人使用您的库,暴露底层数据结构可能会导致一些不希望的行为。也就是说,特别是对于set
和map
,应该只允许您访问符合set
和map
数据结构的方法。。暴露底层表示可能会导致用户在set
中有重复,这是不好的。
话虽如此,(据我所知)没有办法直接使用下面的红黑树。。这在很大程度上取决于你想如何使用它。实现你自己的红黑树很可能是你的最佳选择,或者查看我们的第三方库(也许是Boost?)
您甚至不能保证所使用的数据结构将是红黑树(例如,它至少作为AVL树实现过一次,类似B-、B*或B+树的东西可能也可以)。
因此,了解内部的唯一方法是查看特定的实现,并利用它没有(至少试图)公开的东西。
至于原因:我认为主要是因为这是一种抽象的尝试,而不是公开所有的实现细节。
- 为什么使用 NDK 不能存在不同的 stl 实现?
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- 默认赋值运算符如何在实际 STL 中实现
- hashtable :如何理解这种基于STL中List的hashtable实现
- 如何知道用于实现标准代码段的确切数据结构和算法,例如在C++STL中?
- 使用 Boost HOF 实现 STL 漂亮打印
- 如何在C++中重新实现包含指针的 STL 容器的类的迭代器
- 在C++中实现无STL和无类的最小堆
- 我可以期望某些 STL 函数实现是可自动矢量化的吗?
- 使用 C++ STL 的数组实现
- 我应该如何在恒定长度的 STL 样式数据结构中实现max_size?
- C STL中如何实现Deque
- 错误试图实现STL迭代器
- 关于 c++ stl 谓词的实现
- 为什么不是条件 *First1 == * First2 ??(C++ STL 包括函数实现)
- 使用值类在C 中实现STL MAP
- 如何实现STL容器中对象的快速释放
- 应该如何为自定义类实现STL功能
- 如何实现 STL 风格的迭代器并避免常见的陷阱
- 说出一个实现STL兼容序列容器的好指南)