【问题标题】:Returning zero when the key is not exist in unordered_map当键在 unordered_map 中不存在时返回零
【发布时间】:2016-08-19 19:49:53
【问题描述】:

我有以下容器:

std::unordered_map<uint8_t,int> um;

um 假定有 0 到 255 之间的键,但不是全部。因此,在某个时间点,我想要求它给我例如键 13 的值。如果它在那里,我想要它的值(保证不为 0)。如果不是,我希望它返回 0。

实现这一点的最佳方式(性能观点)是什么?

我到现在为止的尝试:使用 find 并在未找到时返回 0 或在找到时返回值。

附:更改为包含 256 个项目的 std::vector&lt;int&gt; 不是一种选择。我买不起总是存储 256 个值的空间。


编辑:

我的问题是直方图计算问题键(颜色 0-255)值(频繁,int 就足够了)。如果我只知道某个键是否存在,我将不会满足。我还需要值(频繁)。

其他信息:

  • 我永远不会删除任何项目。
  • 我有时会添加项目(最多 256 个项目),通常少于 10 个。
  • 我会多次查询key。
  • 通常查询和插入没有特定的顺序。

【问题讨论】:

  • 平均而言find 是恒定的时间,所以我怀疑你会更快地找到任何东西。
  • 如果find(0)返回0,这意味着什么?是否找到“0”?
  • 与向量相比,无序映射增加了相当多的开销;除非预期的占用率非常低,否则您可能会发现 std::array 更快更小。
  • 我的问题是,如果调用者查询0并且你的函数返回0,调用者将如何解释返回值? 0 是“找到”还是“未找到”?
  • 使用std::vector&lt;std::pair&lt;uint8_t,int&gt;&gt; 它在内存中占用的空间比std::unordered_map 少。使用std::find 会一样快,因为您有一个相对较小的缓冲区可供搜索。

标签: c++ c++11 unordered-map


【解决方案1】:

您需要在内存和速度之间进行权衡。

您的unordered_map 的速度复杂度应该更低。

使用std::vector&lt;std::pair&lt;uint8_t, int&gt;&gt; 会更紧凑(并且对缓存更友好)。

std::pair&lt;std::vector&lt;uint8_t&gt;, std::vector&lt;int&gt;&gt; 会更加紧凑(uint8_tint 之间没有填充)

您甚至可以通过分解大小/容量来做得更好,但它不再在 std:: 中。

使用vector,您还有另一项交易:搜索和添加键的复杂性:

  • 未排序的向量:常数相加,线性搜索
  • 排序向量:线性相加(由于在向量中间插入值)、对数搜索。

【讨论】:

    【解决方案2】:

    我可能会使用向量来实现空间紧凑性。

    保持对数搜索性能排序是很诱人的。但由于预期的元素数量少于 10,我可能会不对其进行排序并使用线性搜索。

    所以

    vector<pair<uint8_t, int>> data;
    

    如果预期元素的数量很大,那么使用排序向量可能会有所帮助。

    Boost 提供类似地图的界面和类似矢量的布局。见boost flat_maphttp://www.boost.org/doc/libs/1_48_0/doc/html/container/non_standard_containers.html#container.non_standard_containers.flat_xxx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-20
      • 2013-10-12
      • 2022-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 2013-04-13
      相关资源
      最近更新 更多