繁体   English   中英

我不明白std :: tr1 :: unordered_map

[英]I don't understand std::tr1::unordered_map

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

我认为链接列表和哈希映射的这种混合应该可以完成这项工作,但在我尝试使用std::tr1::unordered_map之前,我认为它是以我所描述的方式工作,但事实并非如此。 那么有人可以解释一下unordered_map的含义和行为吗?


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

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

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

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

  • 广告订单
  • 字符串比较

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

提升无序容器的文档

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

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

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

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

对不起,请阅读您的上次评论错误。 是的,hash_map不在STL中,map是。 但unordered_map和hash_map与我读过的内容完全相同。

map - > log(n)插入,检索,迭代是有效的(并通过密钥比较排序)

hash_map / unordered_map - >常量时间插入和检索,迭代时间不保证高效

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM