我尝试在map
和unordered_map
之间选择以下用例:
map
的键是一个指针。
最常见的用例是地图中将有一个元素。
通常,地图中的最大元素数小于10。
经常访问地图,速度是最重要的因素。对地图的更改很少发生。
虽然测量速度显然是正确的方法,但此代码将用于多个平台,因此我尝试创建一个通用的经验法则,用于在map
和unordered_map
之间进行选择关于元素的数量。我在这里看到一些帖子暗示std :: map对于少数元素可能更快,但没有给出“小”的定义。
根据元素数量,何时根据map
和unordered_map
进行选择是否有经验法则?另一种数据结构(例如通过vector
的线性搜索)是否更好?
答案 0 :(得分:21)
在始终需要衡量的前提下,为了找出在性能方面更合适的内容,如果所有这些都是真的:
然后我会说你最好把你的元素放在std::vector
中,然后对所有元素进行简单的迭代,找到你正在寻找的元素。
std::vector
将在连续的内存区域中分配其元素,因此缓存局部性可能会为您提供更高的性能 - 在缓存未命中后至少从主内存获取缓存行所需的时间比访问CPU缓存所需的时间高一个数量级。
非常有趣的是,似乎Boost's flat_map
非常适合您的用例(由Praetorian提供):
flat_map
与std::map
类似,但它的实现方式与有序向量相似。 (来自在线文档)
因此,如果您使用Boost是一个选项,您可能想尝试这个。
答案 1 :(得分:4)
我相信你的10个元素或更少的元素,通常只有一个线性搜索未分类的矢量将最有效。但是,根据使用的散列算法,unordered_map可能会更快。
你应该很容易进行基准测试。