我似乎无法找到关于此的任何信息,所以我转向stackoverflow。在C ++中std :: tr1 :: unordered_map的迭代器效率如何?特别是与列表迭代器进行比较。创建一个包含类的包装类是否有意义,它还包含列表中的所有键以允许有效的迭代(我的代码在unordered_map中使用了大量的迭代)。对于那些会推荐使用boost的人,我无法使用它(无论出于何种原因)。
答案 0 :(得分:8)
我没有检查TR1,但N3035(C ++ 0x草案)说明了这一点:
所有迭代器类别 只需要那些功能 可实现给定类别的 恒定时间(摊销)。因此, 迭代器的需求表 没有复杂性列。
除了复杂性之外,该标准不会提供效率保证,因此您无法保证list
和unordered_map
的比较,除非它们都是摊销的固定时间(即,对容器进行完整迭代的线性时间。)
实际上,我希望unordered_map
迭代器至少在list
,附近,除非你的hashmap非常稀疏地填充。在完整迭代的复杂性中可能存在O(桶数)项。但是我从来没有考虑过一个特别针对C ++的unordered_map
实现的实现,所以我不知道在一个简单的“链表列表”哈希表实现上会有什么样的装饰。如果你有一个“典型的”平台测试它,如果你正在尝试编写在所有C ++实现上肯定是最快的代码,那么运气不好,你不能; - )
答案 1 :(得分:7)
unordered_map迭代器基本上只需要遍历哈希表的内部树结构。这只是意味着做一些指针跟随,所以应该非常有效。当然,如果你经常走一条unordered_map,你可能首先使用了错误的数据结构。在任何情况下,对于所有性能问题,答案都是为了让您对特定代码进行计时,看它是否足够快。
答案 2 :(得分:5)
不幸的是,除非你已经尝试并测量结果,否则你无法确定某些东西是否足够有效。我可以告诉你,标准库,TR1和Boost类对它们有很多关注。它们可能与最常见的用例一样快。走一个容器当然是一个常见的用例。
尽管如此,你需要问自己一些问题:
说出我想要的最清楚的方式是什么?编写包装类可能会给代码增加不必要的复杂性。 先使其正确,然后快速完成。
我可以承受额外的内存和时间来保持与list
并行的unordered_map
吗?
unordered_map
真的是正确的数据结构吗?如果您最常见的用例是从头到尾遍历,那么使用vector
可能会更好,因为内存保证是连续的。
答案 3 :(得分:1)
通过这里的基准回答https://stackoverflow.com/a/25027750/1085128 unordered_map位于vector和map之间,用于迭代。它明显快于地图。