【问题标题】:Would a unordered_map be a good choice?unordered_map 会是一个不错的选择吗?
【发布时间】:2015-07-02 12:06:58
【问题描述】:

我想知道 unordered_map 作为我的特定问题的容器是否是一个不错的选择。我读到的关于地图的内容并没有真正涵盖我的内容,即:

  • 容器将存储 100 到 500 个对象(不是 整数/双精度...)
  • 大小永远不会改变。
  • 顺序并不重要,因为对象本身包含某种“索引”。
  • 很多时候(!)我需要过滤容器中的所有元素 属性(例如拥有color==blue

目前我使用向量,这很有效。但是,如果例如unordered_map 会提高性能(关于“过滤”)我可以通过图像来改变它。

【问题讨论】:

  • 最好的方法是尝试一下 :)
  • 如果关于需要过滤的对象的所有信息都在对象中,那么我会使用std::array(如果您愿意浪费空间)或std::vector
  • 每个元素是否有多个不同的属性可以过滤容器?
  • 需要有关您计划进行的过滤类型的更多信息。如果这是对单个属性进行过滤,并且您不需要遍历整个未过滤的集合,那么向量或数组的 unsorted_map 可能会很有用。我忘了 - 有没有 unsorted_multimap 这样的东西?
  • @Arkadiy 是的,有。

标签: c++ dictionary vector std


【解决方案1】:

如果您有多个搜索条件(有时是 color == blue,有时是 flavour == up),std::unordered_map 不会真正帮助您,因为地图只提供对单个预定键的快速查询。

我想说std::vector 对你来说很好,理想情况下包裹在你自己的结构中,它将提供查找接口。如果稍后分析告诉您这还不够快,您可以在此类数据之上构建自己的索引。您甚至不必手动执行此操作,boost::multi_index 是一个为多标准查找而设计的通用容器。

【讨论】:

    【解决方案2】:

    我会使用vector 或简单的数组来存储实际数据。并有一些maps 将键与指针映射到实际数据。

    这会导致更高的内存使用率,但如果经常需要通过不同的索引进行搜索,您可能会牺牲一些内存。

    【讨论】:

      【解决方案3】:

      哈希表(std::unordered_map 是)提供对一个键(键值对)的恒定时间查找。但是,它的常数因子总是比简单数组(提供整数索引的常数时间查找)高(即查找速度较慢)。

      如果您需要根据某些条件过滤一组元素,那么您需要检查每个单独的元素。在这种情况下,哈希表在性能方面比数组/向量更差,因为它的计算复杂度与数组索引相同,但常数因子更差。

      所以不,在这种情况下您没有理由要使用 unordered_map

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-21
        • 2011-07-07
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        • 1970-01-01
        相关资源
        最近更新 更多