【问题标题】:Best practices for searching in unordered_map在 unordered_map 中搜索的最佳实践
【发布时间】:2017-03-14 14:52:53
【问题描述】:

我想创建一个std::unordered_map < int, std::string >std::unordered_map< std::string, int >。 在这张地图中,我将存储字符串及其整数表示。 我将只在代码中填写这张地图(硬编码对)。

我需要将输入字符串转换为它们的 int 值 - 在 map 中查找。 所以我只需要在运行时在地图中搜索。 在这一点上,我需要在转换时获得最佳性能。 在最好的情况下 - O(1)。

我的问题:

  1. 我应该使用字符串作为键还是整数?
  2. 我应该定义自己的哈希函数吗?
  3. 对于 string/int 和 int/string 作为密钥对这两种情况的最佳性能查找函数是什么?

【问题讨论】:

  • 为什么不同时尝试一下,profile(measure) 看看你得到了什么?
  • 如果你有一个string 并且需要找到一个对应的int(正如你在问题中所说的那样)那么显然std::unordered_map<std::string, int>
  • 首先,避免过早优化 (stackoverflow.com/questions/2978460/…) :)
  • @KonstantinL,是的。这是首先:)

标签: c++ performance search find unordered-map


【解决方案1】:

std::mapstd::unordered_map 或它们的 multi 对应部分都是相同的——它们将一个键(第一个模板参数)映射到一个值(第二个)。如果您想获得 O(1)(无序)或 O(log(n))(映射)行为,则需要将要为其获取值的数据类型定义为键。

由于您想找到给定字符串的整数值,因此您的情况是std::unordered_map<std::string, int>

一个反例是查找错误代码的名称,您通常有一个由函数返回的特定错误代码(或放在errno 中)并想要获取 e 的字符串值。 G。用于将错误打印到控制台。 那么您将拥有std::unordered_map<int, std::string>(前提是您无法将错误字符串存储在数组中,因为错误代码分布得太远...)。

编辑:

定义你自己的哈希函数是康斯坦丁在他的评论中提到的那种过早的优化——std::string 提供了自己的哈希码函数,它应该很适合大多数用例。只有当你发现你的散列变得太慢时,才尝试找到更快的方法。

由于你所有的字符串都是硬编码的,你可能想看看完美的散列,例如。 G。在gperf 变体中。

【讨论】:

  • 谢谢。因此,对于简单的硬编码巴黎,我更喜欢使用 unordered_map 通过传入字符串搜索整数值,反之亦然。
  • @SashaDerkach 反之亦然???我以为你只是查找字符串的整数?地图 - 就其性质而言 - 仅在一个方向上快速/有效。在另一个方向上,您需要(可能)迭代所有包含的对。如果这确实是一个要求,那么我将编辑我的答案......
  • @Aconcagua 不,这不是必需的。但是,双向搜索的最佳方式是什么?
  • 好吧,你只能妥协。 “最佳”取决于您的具体要求。如果您知道自己主要是朝一个方向看,而另一个方向是罕见的情况 - 将地图用于常见情况。如果您希望两种查找都相同,请使用具有更便宜比较的类型(此处为:int)作为值,并将另一个作为键。如果您确实需要快速进行两个查找,请使用 both 映射!这使得查找方向变得更快,但代价是冗余数据和更高的内存消耗(因此内存使用不应该成为问题)。
猜你喜欢
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
  • 2021-01-28
相关资源
最近更新 更多