在 boost::intrusive::unordered_set 的存储桶中使用了什么存储策略
What storage policy is being used in the bucket of boost::intrusive::unordered_set?
我知道内部的提升桶是作为喜欢的列表实现的,对吧? 至少根据 http://www.boost.org/doc/libs/1_50_0/doc/html/unordered/buckets.html 看起来是这样。
我的问题是,这些桶中元素的顺序是什么?如果它们是无序的,有没有办法对这些存储桶中的项目顺序强制执行 MRU(最近使用的)或其他一些移动到前面的启发式方法?
编辑:我理解反对在存储桶内强制执行 MRU 的论点。但在我的特定情况下,我知道,强制执行 MRU [甚至具有后到先得] 将优于较小的负载因子。问题是,顺序是什么?有没有一种简单的方法来强制执行至少最后插入先出和上菜。
存储桶未排序。 存储桶未排序是有令人信服的原因。 虽然我相信你知道这一点,但我会列举几个来帮助该网站的未来访问者。
- 哈希
- 映射类型的数据结构不应使迭代器失效,除非插入导致重新哈希
- 为了保持快速查找,存储桶应该很小;理想情况下,每个存储桶中应该只有一个元素。
在我看来,对存储桶强制执行 MRU 排序似乎首先违背了哈希映射类型结构的整个想法。 这个想法是保持桶小,以便平均而言,桶中的第一项是您实际要查找的。
因此,我怀疑是否有任何内置方法可以在存储桶中强制执行 MRU 排序。 我建议调整你的哈希算法,也许会降低你的最大负载因子。
经过一些黑客攻击,回答了我自己的问题。
提升桶的实现在: http://www.boost.org/doc/libs/1_51_0/boost/unordered/detail/buckets.hpp.
尽管这是特定于实现的,并且可能随时更改,但目前,对于侵入性unordered_set,存储桶遍历 [在 .find()] 中从最后插入的项目开始。
例如,如果您要声明一个包含 1000 个存储桶的unordered_set:
class A : public unordered_set_base_hook<> { ... }
unordered_set<A>::bucket_type buckets[1000];
unordered_set<A> a(unordered_set<A>::bucket_traits(buckets, 1000));
并插入 10000 个随机采样的项目 [高得离谱的负载系数 10],最后插入的项目将具有更快的 [数量级] 访问 [查找] 时间。
- 将字符串存储在c++中的稳定内存中
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 使用QProcess执行命令,并将结果存储在QStringList中
- 访问存储在向量C++中的结构的多态成员
- C++17中的并行执行策略
- 如何从存储在std::映射中的std::集中删除元素
- 存储模板类型以强制转换回派生<T>
- 类型总是使用其大小存储在内存中吗
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 使用无符号字符数组有效存储内存
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 带结构的二维矢量:如何存储元素
- 在 boost::intrusive::unordered_set 的存储桶中使用了什么存储策略
- C++存储全局 std::字符串标签与 getter 和 setter 的策略
- 在 c++ 中存储对象的最佳策略是什么,确保名称唯一并能够在以后有效地检索它们
- C++,使用基类指针存储子类和使用派生类方法的策略
- 大容量存储设备删除策略
- 数据结构-在C++中设置“std::unordered_set”中初始存储桶数的策略