我最近才开始研究 boost 和它的容器,我在网上和 stackoverflow 上阅读了几篇文章,认为 boost::unordered_map 是大型集合中性能最快的容器。所以,我有这个类状态,它在容器中必须是唯一的(没有重复),容器中将有数百万甚至数十亿的状态。因此,我一直在尝试将其优化为小尺寸和尽可能少的计算。我之前使用过 boost::ptr_vector,但正如我在 stackoverflow 上所读到的,只要其中没有那么多对象,向量才是好的。在我的例子中,状态描述了来自机器人的感觉运动信息,因此可能存在大量状态,因此快速查找是重中之重。遵循boost 文档对于 unordered_map,我意识到我可以做两件事来加快速度:使用 hash_function,并使用相等运算符根据它们的 hash_function 比较状态。因此,我实现了一个私有 hash() 函数,它接收状态信息并使用 boost::hash_combine 创建一个 std::size_t 哈希值。operator== 基本上比较状态的哈希值。所以:
std::size_t 是否足以涵盖数十亿可能的 hash_function 组合?为了避免重复状态,我打算使用它们的 hash_values。
创建 state_map 时,我应该使用 State* 还是哈希值作为键?即:
boost::unordered_map<State*,std::size_t> state_map;
或boost::unordered_map<std::size_t,State*> state_map;
boost::unordered_map::iterator = state_map.find() 的查找时间是否比通过 boost::ptr_vector 并比较每个迭代器的键值更快?
最后,任何关于如何优化这种无序地图以实现速度和快速查找的提示或技巧将不胜感激。
编辑:我已经看到了很多答案,一个是不使用 boost 但 C++0X,另一个不使用 unordered_set,但老实说,我仍然想看看 boost::unordered_set 如何与散列函数一起使用. 我遵循了boost的文档并实现了,但我仍然无法弄清楚如何将boost的散列函数与有序集一起使用。