几个元素的map vs unordered_map

时间:2013-03-25 21:35:21

标签: c++ c++11 std

我尝试在mapunordered_map之间选择以下用例:

map的键是一个指针。 最常见的用例是地图中将有一个元素。 通常,地图中的最大元素数小于10。 经常访问地图,速度是最重要的因素。对地图的更改很少发生。

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

根据元素数量,何时根据mapunordered_map进行选择是否有经验法则?另一种数据结构(例如通过vector的线性搜索)是否更好?

2 个答案:

答案 0 :(得分:21)

始终需要衡量的前提下,为了找出在性能方面更合适的内容,如果所有这些都是真的:

  1. 对地图的更改不常见;
  2. 地图最多包含10个元素;
  3. 查找频繁;
  4. 你非常关心表演;
  5. 然后我会说你最好把你的元素放在std::vector中,然后对所有元素进行简单的迭代,找到你正在寻找的元素。

    std::vector将在连续的内存区域中分配其元素,因此缓存局部性可能会为您提供更高的性能 - 在缓存未命中后至少从主内存获取缓存行所需的时间比访问CPU缓存所需的时间高一个数量级。

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

      

    flat_mapstd::map类似,但它的实现方式与有序向量相似。 (来自在线文档

    因此,如果您使用Boost是一个选项,您可能想尝试这个。

答案 1 :(得分:4)

我相信你的10个元素或更少的元素,通常只有一个线性搜索未分类的矢量将最有效。但是,根据使用的散列算法,unordered_map可能会更快。

你应该很容易进行基准测试。