[英]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教程:列出快速查找
不同之处在于如何生成查找的方法。
在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.