我一直在观看来自CppCon 2014的这个video和discovered,在std::unordered_map
下面有一个访问存储桶的界面。现在我有几个问题:
答案 0 :(得分:11)
搜索引入项目的提案通常很有启发性,因为通常会有相应的理由。在这种情况下,N1443说明了这一点:
<强“G。铲斗接口
与所有标准容器一样,每个散列容器都有成员 function begin()和end()。范围[c.begin(),c.end())包含 容器中的所有元素,以平坦范围呈现。 存储桶中的元素是相邻的,但是迭代器接口 没有提供关于一个桶结束和下一个桶结束的信息 开始。
出于两个原因,暴露铲斗结构也很有用。 首先,它允许用户调查其哈希函数的效果 执行:它让他们测试元素在其中的均匀分布 桶,并查看桶内的元素,看看它们 有任何共同的属性。第二,如果迭代器有一个 基础分段结构(正如它们在现有的单一链接中所做的那样) 列表实现),利用该结构的算法 显式嵌套循环,可以比查看的算法更有效 元素作为平坦范围。
存储桶接口最重要的部分是重载 begin()和end()。如果n是整数,则[begin(n),end(n))是一个范围 迭代器指向第n个存储桶中的元素。这些成员 函数返回迭代器,当然,但不是X :: iterator或类型 X ::为const_iterator。相反,它们返回类型的迭代器 X :: local_iterator或X :: const_local_iterator。本地迭代器是可以的 在桶中迭代,但不一定在桶之间;在 在某些实现中,X :: local_iterator可能是一个 比X :: iterator更简单的数据结构。 X :: iterator和 允许X :: local_iterator使用相同的类型;实现 使用双链表可能会利用这一点 自由度。
此存储桶接口不是由SGI,Dinkumware或 Metrowerks实施。它的灵感部分来自Metrowerks 碰撞检测界面,部分通过早期工作(见 [Austern 1998])关于分段容器的算法。
答案 1 :(得分:3)
如果您处于高性能状态并且碰撞最终导致您死亡,我想您可以从中受益匪浅。迭代桶并定期查看桶大小可以告诉您散列策略是否足够好。
在性能方面,无序映射在很大程度上取决于它们的散列策略。
答案 2 :(得分:2)
有许多算法要求将对象散列到一定数量的桶中,然后处理每个桶。
说,你想在集合中找到重复项。您散列集合中的所有项目,然后在每个存储桶中成对地比较项目。
用于查找频繁项目集的Apriori algorithm是一个不那么简单的例子。
答案 3 :(得分:2)
我需要界面的唯一原因是遍历地图中的所有对象,而无需在地图上保持锁定或复制地图。这可用于不精确的到期或对地图中对象的其他类型的定期检查。
导线的工作原理如下:
锁定地图。
开始按桶顺序遍历地图,对您遇到的每个对象进行操作。
当您决定锁定时间过长时,请存放您上次操作的物品的钥匙。
等到您想继续操作。
锁定地图,然后转到步骤2,从停止的钥匙处开始(以桶顺序)开始。如果你到达目的地,请从头开始。