我需要一个关联容器,它让我通过一个字符串索引某个对象,但这也保持了插入的顺序,所以我可以通过它的名字查找一个特定的对象,或者只是迭代它并检索同一个对象我把它们插入了。
我认为这个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:所以,如果我做对了,区别在于实现(以及性能),而不是它在外部的行为方式。
答案 0 :(得分:17)
您已经询问了为什么制作Boost :: MultiIndex的规范原因:列出按键快速查找的插入顺序。 Boost MultiIndex tutorial: list fast lookup
答案 1 :(得分:7)
答案 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会实现两次相同的东西,并以不同的方式调用它。