unordered_map中的迭代器效率(C ++)

时间:2010-03-23 12:24:08

标签: c++ iterator unordered-map

我似乎无法找到关于此的任何信息,所以我转向stackoverflow。在C ++中std :: tr1 :: unordered_map的迭代器效率如何?特别是与列表迭代器进行比较。创建一个包含类的包装类是否有意义,它还包含列表中的所有键以允许有效的迭代(我的代码在unordered_map中使用了大量的迭代)。对于那些会推荐使用boost的人,我无法使用它(无论出于何种原因)。

4 个答案:

答案 0 :(得分:8)

我没有检查TR1,但N3035(C ++ 0x草案)说明了这一点:

  

所有迭代器类别   只需要那些功能   可实现给定类别的   恒定时间(摊销)。因此,   迭代器的需求表   没有复杂性列。

除了复杂性之外,该标准不会提供效率保证,因此您无法保证listunordered_map的比较,除非它们都是摊销的固定时间(即,对容器进行完整迭代的线性时间。)

实际上,我希望unordered_map迭代器至少在list附近,除非你的hashmap非常稀疏地填充。在完整迭代的复杂性中可能存在O(桶数)项。但是我从来没有考虑过一个特别针对C ++的unordered_map实现的实现,所以我不知道在一个简单的“链表列表”哈希表实现上会有什么样的装饰。如果你有一个“典型的”平台测试它,如果你正在尝试编写在所有C ++实现上肯定是最快的代码,那么运气不好,你不能; - )

答案 1 :(得分:7)

unordered_map迭代器基本上只需要遍历哈希表的内部树结构。这只是意味着做一些指针跟随,所以应该非常有效。当然,如果你经常走一条unordered_map,你可能首先使用了错误的数据结构。在任何情况下,对于所有性能问题,答案都是为了让您对特定代码进行计时,看它是否足够快。

答案 2 :(得分:5)

不幸的是,除非你已经尝试并测量结果,否则你无法确定某些东西是否足够有效。我可以告诉你,标准库,TR1和Boost类对它们有很多关注。它们可能与最常见的用例一样快。走一个容器当然是一个常见的用例。

尽管如此,你需要问自己一些问题:

  1. 说出我想要的最清楚的方式是什么?编写包装类可能会给代码增加不必要的复杂性。 先使其正确,然后快速完成。

  2. 我可以承受额外的内存和时间来保持与list并行的unordered_map吗?

  3. unordered_map真的是正确的数据结构吗?如果您最常见的用例是从头到尾遍历,那么使用vector可能会更好,因为内存保证是连续的。

答案 3 :(得分:1)

通过这里的基准回答https://stackoverflow.com/a/25027750/1085128 unordered_map位于vector和map之间,用于迭代。它明显快于地图。