哈希映射和有序遍历

时间:2012-12-06 22:30:16

标签: c++ iterator hashmap abstract-data-type

我将从头开始在C ++中实现哈希映射作为全功能抽象数据类型。特别是,我将为这个数据容器提供一个迭代器,它能够按照识别键的升序遍历所有记录。这部分让我困惑,我不知道该怎么做。顺便说一句,通过散列功能,我决定使用单向链接和单向列表。我遇到的一个解决方案是创建另一个列表,它将以适当的顺序完全绑定所有元素,在插入过程本身期间将保护哪些功能。但在我看来,它会损害哈希本身的许多好处,至少在插入方面是这样;特别是考虑到我的ADT的目的,遍历功能将相对较少使用。长话短说,我应该提供什么样的解决方案?请注意,我不能使用任何专门的库。

注:

我知道哈希映射是什么,并且它的学术定义本质上是无序的。也许我应该换一种方式,我要建立一个混合的,实用的,ADT,它基本上由一个哈希映射加上一些额外的轻量级模块,它们将提供迭代器功能,以便这样一个ADT的用户可以从按键升序排列记录的时间。

2 个答案:

答案 0 :(得分:3)

哈希地图本质上是无序的。这就是为什么它们通常在c ++中命名为unordered_map。哈希映射的迭代器将访问每个成员一次,但是以未定义的顺序。

在实践中,您可能要么不使用哈希映射并使用其他关联映射容器,如红黑树。或者,如果更新很少,您将维护并行有序索引。或者如果频繁更新但是遍历很少,则按需生成排序索引。

答案 1 :(得分:0)

Hashmaps本质上没有排序,因为整个要点是使用哈希来知道值的存储位置。

我能看到可能工作的唯一方法(在性能和实际可用性方面有所代价)是你保证散列总是在增加,即散列是命令的函数插入,它给出有序的哈希。但这只会照顾非碰撞的哈希。您仍然需要按照正确的顺序在一个存储桶中遍历您的列表,因此只需在插入时保持列表排序

也许这不起作用,这只是一个想法

如果没有,唯一的另一种方法是将所有值存储在排序友好的结构中并从那里进行迭代。如果你在hashmap类中执行此操作,它看起来就像是在迭代hashmap但你并不是真的。请记住,这种方法会在迭代时将内存需求加倍

让我们知道它是怎么回事,这是一个奇怪的要求