c++ - C++ STL中的二叉搜索树实现?

标签 c++ binary-tree binary-search

请问您知道 C++ STL 是否包含 二叉搜索树 (BST) 实现,或者我是否应该构建自己的 BST 对象?

如果 STL 不包含 BST 的实现,是否有可用的库?

我的目标是能够尽快找到所需的记录:我有一个记录列表(它不应该超过几千个。),我做一个每帧(它是一个电脑游戏)在该列表中搜索。我使用 unsigned int 作为我感兴趣的记录的标识符。无论哪种方式最快对我来说都是最好的。

最佳答案

您需要一种在给定 key 的情况下查找某些数据的方法。由于键是 unsigned int,这为您提供了多种可能性。当然,你可以使用 std::map:

typedef std::map<unsigned int, record_t> my_records;

但是,还有其他可能性。例如, HashMap 很可能会比二叉树更快。 HashMap 在 C++ 中称为 unordered_map,是 C++11 的一部分。标准,可能已经被您的编译器/标准库支持(检查您的编译器版本和文档)。它们首次出现在 C++TR1 (std::tr1::unordered_map)

如果您的键分布相当紧密,您甚至可以使用一个简单的 数组 并将键用作索引。当谈到原始速度时,没有什么能比索引到数组中更好了。 OTOH,如果您的 key 分配过于随机,您将浪费大量空间。

如果您将记录存储为指针,移动它们的成本很低,另一种方法可能是将数据按键排序在 vector 中:

typedef std::vector< std::pair<unsigned int, record_t*> > my_records;

由于其更好的数据局部性,可能与处理器缓存配合得很好,一个简单的 std::vector 通常比理论上应该具有优势的其他数据结构执行得更好。它的弱点是插入/从中取出。但是,在这种情况下,在 32 位系统上,这将需要移动 2*32 位 POD 的条目,您的实现可能会通过调用 CPU 内部函数来执行内存移动。

关于c++ - C++ STL中的二叉搜索树实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5085091/

相关文章:

c++ - 证明构造函数 C++ 之前调用初始化列表的任何示例

c++ - 将字符转换为 ASCII?

C++:模板可以成为类的 friend 吗?

将二叉树转换为c中的数组

java - 从中序和先序遍历重建二叉树

algorithm - 停止二分查找的证明

c++ - Boost.Spirit - 如何使用 repeat 解析成一个结构体?

algorithm - 右线程二叉树

java - Java 中的集合和/或数组是否有正确的 upperBound 和 lowerBound?

c - 使用二进制搜索优化大型 if-else 分支