我正在使用std::map
来存储很多元素(元素对),我有一点“怀疑”。在std::map
,iterator
或reverse_iterator
上迭代所有元素的效率更高?
答案 0 :(得分:25)
对于记录,<{1}}和reverse_iterator
容器上的解除引用std::map
<使用{{1} - 在Intel / AMD处理器上同时使用-O3 gcc 3.4.6和MSVC(在PPC体系结构上几乎是3倍。)std::set
与iterator
相同。这是因为const_reverse_iterator
实际上指向树节点后面的树节点被解除引用,因此额外的工作。 const_iterator
迭代器表现出更温和的差异(reverse_iterator
在PPC上只慢约30%,在Intel / AMD上几乎无法区分。)顺便说一下,std::vector
迭代器比{reverse_iterator
迭代器快20倍。 {1}}或std::vector
迭代器。
std::map
答案 1 :(得分:13)
真的重要吗?这些是您必须尝试避免恕我直言的微优化的类型。此外,即使迭代时间因地图中的大量元素而发生变化,您尝试迭代这样一个大地图的所有元素这一事实意味着您很可能选择了错误的数据结构。
答案 2 :(得分:3)
除非您对代码进行了分析并发现存在重大差异,否则我不会对此感到担心。
“过早优化是其根源 所有的邪恶。“ - 唐纳德克努特
答案 3 :(得分:1)
可能没有区别。 std :: reverse_iterator只是一个模板填充程序,可以在编译时将++转换为 - 。
对于向量或其他连续存储容器,正向迭代器可能与高速缓存相比与反向迭代器相比稍微好一点(不太可能检测到它),但对于基于树的容器,它会赢得' t根本没有任何区别 - 没有任何可供参考的地方。
答案 4 :(得分:0)
我认为使用reverse_iterator是没有意义的;这是违反直觉的。
这会使代码更难理解,有人会查看代码并转到“wtf”;如果你需要发表评论来解释原因,那可能意味着它不是一个很好的代码。
答案 5 :(得分:-1)
我想知道迭代的必要性。 Map包含键值对,通常用于查找。如果由于某些原因仍然需要迭代地图(可能正在删除地图中包含的指针等),那么您可以使用std::for_each。忘记微优化,你可以尝试提高代码的可读性。