当键是整数时,使用std::unordered_map
或std::vector
的性能有何不同?我大约有100-1000个元素,这些元素具有可用于访问向量的连续ID。使用哈希表的原因是更方便按对象本身进行索引。
想象一下三种不同的情况:
请注意,我问的是一个一般性问题,而不是特定于代码的问题。
答案 0 :(得分:1)
通常来说。
如果您有类似100-1000
的元素,那么容器本身并不重要-使用std::map
甚至比std::unordered_map
更好,例如,如果您需要调试打印内容-除非您以某种方式依赖哈希。当您遇到类似100k +的元素时,容器的性能开始变得有趣起来。
答案 1 :(得分:0)
通常:
由于缺乏间接性,向量具有更好的缓存一致性。访问索引的速度更快,因为不需要计算哈希函数。迭代具有可预测的分支。
无序映射使用稀疏结构的内存较少(您说索引是连续的,因此此优点不适用于您)。使用无序映射,在任意索引中添加或删除元素的渐近速度更快。
当您只有极少数元素(例如100-1000)时,渐进复杂度不一定重要。在这种情况下,缓存一致性和分支预测趋于占主导地位。
首先选择哪种数据结构更方便。然后测量访问该结构是否对整个程序的性能有重大影响。如果是的话,则测量与其他数据结构的差异,看它是否明显更快(相对于测量方差)。