我不明白std :: tr1 :: unordered_map

时间:2008-08-30 13:20:43

标签: c++ tr1 unordered-map

我需要一个关联容器,它让我通过一个字符串索引某个对象,但这也保持了插入的顺序,所以我可以通过它的名字查找一个特定的对象,或者只是迭代它并检索同一个对象我把它们插入了。

我认为这个hybrid of linked list and hash map应该可以完成这项工作,但在我尝试使用std::tr1::unordered_map之前认为它是以我所描述的方式工作之前,但事实并非如此。那么有人可以向我解释unordered_map的含义和行为吗?


@wesc:我确定std :: map是由STL实现的,而我确定std :: hash_map不在STL中(我认为旧版本的Visual Studio将它放在名为stdext的命名空间中)。

@cristopher:所以,如果我做对了,区别在于实现(以及性能),而不是它在外部的行为方式。

7 个答案:

答案 0 :(得分:17)

您已经询问了为什么制作Boost :: MultiIndex的规范原因:列出按键快速查找的插入顺序。 Boost MultiIndex tutorial: list fast lookup

答案 1 :(得分:7)

您需要以两种方式索引关联容器:

  • 广告订单
  • 字符串比较

尝试Boost.MultiIndexBoost.Intrusive。我没有用这种方式,但我认为这是可能的。

答案 2 :(得分:4)

Boost documentation of unordered containers

不同之处在于如何生成查找方式。

在map / set容器中,operator<用于生成有序树。

在无序容器中,使用operator( key ) => index

有关其工作原理的说明,请参阅散列。

答案 3 :(得分:2)

抱歉,请错读上一条评论。是的,hash_map不在STL中,map是。但unordered_map和hash_map与我读过的内容完全相同。

地图 - &gt; log(n)插入,检索,迭代是有效的(并通过密钥比较排序)

hash_map / unordered_map - &gt;恒定时间插入和检索,迭代时间不保证是高效的

这些都不适合你自己,因为地图根据关键内容而不是插入顺序排序事物(除非你的密钥包含有关插入序列的信息)。

您必须执行您所描述的内容(list + hash_map),或创建具有插入序列号加上适当比较函数的密钥类型。

答案 4 :(得分:0)

认为 unordered_map和hash_map或多或少是相同的。区别在于STL没有正式拥有hash_map(你正在使用的东西可能是编译器特定的东西),所以unordered_map是对这个遗漏的修复。

unordered_map就是......无序的。你不能依赖它来保留迭代的任何顺序。

答案 5 :(得分:0)

你确定所有 STL实现中都存在std :: hash_map吗? SGI STL实现了它,但是无论如何,GNU g ++都没有它(它位于__gnu_cxx命名空间中)。据我所知,hash_map一直是非标准的,现在tr1正在修复它。

答案 6 :(得分:-3)

@wesc:STL有std :: map ...那么与unordered_map的区别是什么?我不认为STL会实现两次相同的东西,并以不同的方式调用它。