std :: tr1 :: unordered_map
,认为它是按照我描述的方式工作的,但实际上并不是。所以有人能解释一下unordered_map
的含义和行为吗?
@wesc: 我确定std::map是由STL实现的,而我确定std::hash_map不在STL中(我认为旧版本的Visual Studio将其放在名为stdext的命名空间中)。
@cristopher: 所以,如果我理解正确,区别在于实现方式(因此性能不同),而不是外部行为上的区别。
std :: tr1 :: unordered_map
,认为它是按照我描述的方式工作的,但实际上并不是。所以有人能解释一下unordered_map
的含义和行为吗?
@wesc: 我确定std::map是由STL实现的,而我确定std::hash_map不在STL中(我认为旧版本的Visual Studio将其放在名为stdext的命名空间中)。
@cristopher: 所以,如果我理解正确,区别在于实现方式(因此性能不同),而不是外部行为上的区别。
区别在于查找方式的不同。
在 map/set 容器中,使用 operator<
生成有序树。
在无序容器中,使用 operator( key ) => index
生成。
请参阅哈希散列的描述以了解其工作原理。
对不起,我误读了你的最后一条评论。是的,hash_map不在STL中,而map在其中。但根据我所阅读的资料,unordered_map和hash_map是相同的。
map -> 对数(n)插入、检索和迭代效率高(并按键比较有序)
hash_map/unordered_map -> 常数时间插入和检索,迭代时间不能保证效率
这两个选项都无法单独解决您的问题,因为map基于键内容而不是插入顺序进行排序(除非您的键包含有关插入顺序的信息)。
您必须执行您所描述的操作(列表+hash_map),或者创建一个具有插入顺序号和适当比较函数的键类型。
我认为unordered_map和hash_map基本上是一样的东西。不同之处在于STL没有官方的hash_map(你使用的可能是编译器特定的东西),因此unordered_map是弥补这个遗漏的方法。
unordered_map就是无序的。你不能依赖它在迭代时保留任何顺序。
@wesc:STL有std::map……那么unordered_map有什么不同呢?我不认为STL会实现两次相同的东西并以不同的方式命名。