在 boost::intrusive::unordered_set 的存储桶中使用了什么存储策略

What storage policy is being used in the bucket of boost::intrusive::unordered_set?

本文关键字:存储 策略 什么 intrusive boost unordered set      更新时间:2023-10-16

我知道内部的提升桶是作为喜欢的列表实现的,对吧? 至少根据 http://www.boost.org/doc/libs/1_50_0/doc/html/unordered/buckets.html 看起来是这样。

我的问题是,这些桶中元素的顺序是什么?如果它们是无序的,有没有办法对这些存储桶中的项目顺序强制执行 MRU(最近使用的)或其他一些移动到前面的启发式方法?

编辑:我理解反对在存储桶内强制执行 MRU 的论点。但在我的特定情况下,我知道,强制执行 MRU [甚至具有后到先得] 将优于较小的负载因子。问题是,顺序是什么?有没有一种简单的方法来强制执行至少最后插入先出和上菜。

存储桶未排序。 存储桶未排序是有令人信服的原因。 虽然我相信你知道这一点,但我会列举几个来帮助该网站的未来访问者。

    哈希
  1. 映射类型的数据结构不应使迭代器失效,除非插入导致重新哈希
  2. 为了保持快速查找,存储桶应该很小;理想情况下,每个存储桶中应该只有一个元素。

在我看来,对存储桶强制执行 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],最后插入的项目将具有更快的 [数量级] 访问 [查找] 时间