G. Bucket接口
像所有标准容器一样,每个哈希容器都有成员函数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实现中均未提供此桶(Bucket)接口。这一接口部分启发自Metrowerks碰撞检测接口,部分启发自早期对于分段容器算法的研究(请参见Austern 1998)。
unordered_map
。 - The Paramagnetic Croissantunordered_map
存在的主要原因就是为了提供比有序映射更好的性能优势。 - David Schwartzunordered_map
。我只是断言,在这些情况下,性能意识的微调并不重要。 - The Paramagnetic Croissant有一些算法需要将对象哈希到一些桶中,然后处理每个桶。
比如说,你想在一个集合中查找重复项。你将集合中的所有项进行哈希,然后在每个桶中逐对比较项。
再举一个不太琐碎的例子是用于查找频繁项集的Apriori算法。
std::unordered_map
的标准接口暴露了这个实现细节。这太可怕了。 - The Paramagnetic Croissantstd::priority_queue
相比,后者虽然要求特定的实现但接口非常有限,几乎对任何具体用途都没什么用)。 - Matteo Italia