【问题标题】:Iterator access performance for STL map vs. vector?STL 映射与向量的迭代器访问性能?
【发布时间】:2010-10-18 08:19:08
【问题描述】:

使用迭代器遍历 STL 映射与使用向量之间的性能差异是什么?我想使用 map 键进行插入、删除和一些访问,但我还需要对 map 中的 每个 元素进行常规访问。

【问题讨论】:

    标签: c++ performance stl map iterator


    【解决方案1】:

    遍历映射可能是线性的,但实际上,从 C++ 中的实现来看,它的效率并不高。所以我的建议是使用向量并使用另一个地图在线性时间内定位向量中的项目。

    【讨论】:

      【解决方案2】:

      This link 为所有 STL 容器上的各种操作提供了一个很好的性能表。

      一般来说,如果您需要根据一个键进行大量插入、删除或搜索,那么地图就是最佳选择。

      如果您只需要设置一次容器,然后像数组一样访问它,那么请使用向量。

      编辑:STL 容器操作性能表:

      【讨论】:

      • 这个问题有一个微妙之处。用户不想访问一个元素,而是想访问地图中的 所有 元素。摊销成本分析得出整个地图横断的 O(N)(树中的每条边只横断两次,一次向下,一次向上)。
      • 链接已损坏。我想应该是:devmentor.org/references/stl/stl.php
      • 为什么插入向量的头部是 n/a 而移除向量的头部是 O(1)?他们都应该是O(n)。向量查找是 O(log n)?那里有问题。
      • 我不知道为什么人们都赞成这个,这张桌子似乎是假的。
      • 我们真正需要知道的是,“在什么时候使用mapvector 相比更有效,分别用于删除和循环迭代?”跨度>
      【解决方案3】:

      使用 map 和 vector,遍历整个集合是 O(N)。但是(就像列表与向量一样)向量连续存储元素,因此访问下一个元素要便宜得多,因为它会以最佳方式使用缓存,而地图不会。

      但由于您需要根据键进行查找,因此没有其他选择。您可以使用按第一个元素排序的对向量,但如果集合需要是可变的,这将非常慢。只需使用地图。

      【讨论】:

        【解决方案4】:

        浏览树并不昂贵(像跟​​随链表一样的大模式),使用向量不会从缓存中受益太多,但通常这是您在迭代时所做的事情,而不是迭代本身.

        您能否告诉我们更多关于您在遍历整个地图时期望做什么?

        【讨论】:

          【解决方案5】:

          遍历地图的每个元素需要 O(n) 时间。 wikipedia

          【讨论】:

            【解决方案6】:

            如果您需要通过钥匙快速访问,请使用地图。否则一直使用向量,除非探查器会发现一些性能问题。

            【讨论】:

            • 对地图中每个元素的访问更为重要,因为它会经常触发,但我仍然需要相当快速的基于键的查找(我可以取消这个要求,但事情会变得不合理的多毛)。根据上述 Greg Rogers 的回答,地图似乎更合适。
            猜你喜欢
            • 2011-04-02
            • 2011-05-01
            • 1970-01-01
            • 2011-05-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多