Map vs unordered_map用于少数元素

map vs unordered_map for few elements

本文关键字:元素 用于 map vs unordered Map      更新时间:2023-10-16

对于以下用例,我试图在mapunordered_map之间进行选择:

map键为指针。最常见的用例是映射中将有单个元素。一般来说,map中元素的最大个数小于10。地图的访问非常频繁,速度是最重要的因素。对映射的更改很少。

虽然在这里测量速度显然是正确的方法,但此代码将在几个平台上使用,因此我试图创建一个基于元素数量在mapunordered_map之间进行选择的一般经验法则。我在这里看到一些帖子暗示std::map对于小数元素可能更快,但是没有给出"小"的定义。

是否有一个经验法则,当mapunordered_map之间的选择基于元素的数量?另一种数据结构(如通过vector进行线性搜索)更好吗?

在您总是需要进行测量以找出在性能方面更合适的前提下,如果所有这些都是正确的:

  1. 地图变化不频繁;
  2. 地图最多包含10个元素;
  3. 查找将频繁;
  4. 你非常关心性能;

然后我会说你最好把你的元素放在std::vector中,并对所有元素执行一个简单的迭代来找到你正在寻找的元素。

一个std::vector将在一个连续的内存区域分配它的元素,所以缓存局部性可能会给你一个更好的性能——在缓存丢失后从主存中获取缓存行所需的时间至少比访问CPU缓存所需的时间高一个数量级。

非常有趣的是,Boost的flat_map似乎非常适合你的用例(由Praetorian提供):

flat_map类似于std::map,但它被实现为有序向量。(来自在线文档)

如果你可以使用Boost,你可以试试这个

我相信对于10个或更少元素的情况,通常只有一个,对未排序向量的线性搜索将是最好的。但是,根据所使用的哈希算法,unordered_map可能更快。