English 中文(简体)
我不理解std::tr1::unordereded_map
原标题:
  • 时间:2008-08-30 13:20:42
  •  标签:

我需要一个关联容器,它可以通过字符串为某个对象建立索引,但也可以保持插入顺序,这样我就可以通过名称查找特定对象,或者只对其进行迭代,并以与插入对象相同的顺序检索对象。

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


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

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

最佳回答

增强无序容器的文档

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

在映射/集合容器中,运算符<用于生成有序树。

在无序容器中,运算符(键)=>;使用索引

请参阅哈希以了解其工作原理。

问题回答

您已经询问了制作Boost::MultiIndex的典型原因:按键快速查找的列表插入顺序Boost MultiIndex教程:列出快速查找

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

  • Insertion order
  • String comparison

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

对不起,你最后的评论读错了。是的,hash_map不在STL中,map在。但从我读到的内容来看,unordered_map和hash_map是一样的。

地图->;log(n)插入、检索、迭代是有效的(并且按关键字比较排序)

hash_map/unordereded_map->;固定时间的插入和检索,迭代时间不能保证有效

这两者都不适用于您,因为映射是根据密钥内容而不是插入序列来排序的(除非您的密钥中包含有关插入序列的信息)。

您必须执行所描述的操作(list+hash_map),或者创建一个具有插入序列号和适当比较函数的键类型。

认为无序映射和hash_map或多或少是一回事。不同的是,STL没有正式的hash_map(您使用的可能是编译器特定的东西),所以unordered_map是解决这一遗漏的方法。

无序映射只是。。。无序的。你不能依赖它来保持迭代中的任何顺序。

您确定std::hash_map存在于所有STL实现中吗?SGI STL实现了它,但是GNU g++从4.3.1开始就没有它(它位于__GNU_cxx命名空间中)。据我所知,hash_map一直是非标准的,现在tr1正在解决这个问题。





相关问题
热门标签