4

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

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


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

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

4

7 回答 7

17

您已经询问了为什么要创建 Boost::MultiIndex 的典型原因:通过键快速查找的列表插入顺序。 Boost MultiIndex 教程:列表快速查找

于 2008-08-30T15:04:13.377 回答
7

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

  • 广告订单
  • 字符串比较

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

于 2008-08-30T14:47:15.383 回答
4

提升无序容器的文档

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

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

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

有关其工作原理的描述,请参见散列。

于 2008-08-30T13:53:56.120 回答
2

抱歉,您的最后一条评论读错了。是的,hash_map 不在 STL 中,而 map 是。但是 unordered_map 和 hash_map 与我一直在阅读的内容相同。

map -> log(n) 插入、检索、迭代是高效的(并通过键比较排序)

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

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

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

于 2008-08-30T14:21:51.483 回答
0

认为unordered_map 和 hash_map 或多或少是一回事。不同之处在于 STL 没有正式的 hash_map(您使用的可能是编译器特定的东西),因此 unordered_map 是该遗漏的修复。

unordered_map 就是……无序的。您不能依赖它在迭代中保留任何顺序。

于 2008-08-30T13:31:42.163 回答
0

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

于 2008-08-30T13:57:23.943 回答
-3

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

于 2008-08-30T13:41:01.470 回答