C++ 少数元素的映射与无序_映射

C++ 少数元素的映射与无序_映射,c++,c++11,std,C++,C++11,Std,对于以下用例,我试图在map和unordered\u map之间进行选择: 映射的键是指针。 最常见的用例是地图中只有一个元素。 通常,贴图中的最大元素数小于10。 地图经常被访问,速度是最重要的因素。对地图的更改很少 虽然在这里测量速度显然是正确的方法,但这段代码将在多个平台上使用,因此我尝试创建一个通用的经验法则,根据元素数量在map和unordered\u map之间进行选择。我在这里看到一些帖子暗示,对于少量元素,std::map可能更快,但没有给出“small”的定义 根据元素的数量,

对于以下用例,我试图在
map
unordered\u map
之间进行选择:

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

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


根据元素的数量,何时在
映射
无序映射
之间进行选择,是否有经验法则?另一种数据结构(如通过
向量的线性搜索)是否更好?

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

  • 地图的变化并不频繁
  • 地图最多包含10个元素
  • 查询将是频繁的
  • 你很在乎表现 然后我会说,最好将您的元素放在
    std::vector
    中,然后对所有元素执行简单的迭代,以找到您正在寻找的元素

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

    非常有趣的是,它似乎非常适合您的用例(由提供):

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


    因此,如果使用Boost是您的一种选择,您可能会想尝试一下这个方法。

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


    基准测试应该很容易。

    这种数据结构的性能是否如此重要,以至于您需要关心您使用的是哪种数据结构?@KevinBallard当您在内部循环中访问地图时,这一点可能很重要。这个问题可能主要是出于好奇,而不是出于实际需要。我感觉像矢量对于<10个元素和由于数据局部性而不经常更改的情况,可能会更快。您可能还希望对向量进行排序(假设不经常更新)以提供更好的分支预测性能。如果OP可以使用Boost,则可能是此用例的理想选择。@YaserZhian如果数组已排序(假设存在排序),比较不必是直接平等的。例如,循环可以在分支条件
    *iter>=item
    的情况下退出,随后在循环外部进行相等性测试。事实上,将其与列表末尾的sentinel项(严格地说是>所有可能的项)一起使用,会将相等性测试和退出循环的测试(
    iter!=list.end()
    )合并为一个相等性。@sfstewman:谢谢您的解释。但这并没有改变这样一个事实,即分支将被精确地(或最多)执行一次,这是无用的(和/或不可能的)预测。我想我们真正想要实现的是以某种方式向CPU提示分支没有被执行。使用哨兵将这些条件组合成一个条件也很有帮助,因为它会删除第二个分支(很可能会落在第一个分支的阴影中)。然而,大多数CPU不都预测冷分支(他们还没有看到)在向前跳时不会被取用吗?再次感谢@但不管我们是否对数据进行排序,它都会保持不变,不是吗?我的意思是,我们正在搜索一个特定元素,而所有其他比较都不会导致执行分支,无论是否排序数据。对吗?