std :: unordered_map中的bucket接口有什么用?

时间:2015-06-29 20:52:28

标签: c++ c++11 stl

我一直在观看来自CppCon 2014的这个videodiscovered,在std::unordered_map下面有一个访问存储桶的界面。现在我有几个问题:

  • 是否有使用此界面的合理示例?
  • 为什么委员会决定定义这个界面,为什么典型的STL容器界面还不够?

4 个答案:

答案 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)

我需要界面的唯一原因是遍历地图中的所有对象,而无需在地图上保持锁定或复制地图。这可用于不精确的到期或对地图中对象的其他类型的定期检查。

导线的工作原理如下:

  1. 锁定地图。

  2. 开始按桶顺序遍历地图,对您遇到的每个对象进行操作。

  3. 当您决定锁定时间过长时,请存放您上次操作的物品的钥匙。

  4. 等到您想继续操作。

  5. 锁定地图,然后转到步骤2,从停止的钥匙处开始(以桶顺序)开始。如果你到达目的地,请从头开始。