在unordered_map中搜索的最佳实践

时间:2017-03-14 14:52:54

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

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

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

我的问题:

  1. 我应该使用string作为键还是int?
  2. 我应该定义自己的哈希函数吗?
  3. 对于两个案例string / int和int / string作为键对的最佳性能查找函数是什么?

2 个答案:

答案 0 :(得分: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>(假如由于错误代码分布太远而无法将错误字符串存储在数组中......)。

编辑:

定义自己的哈希函数是Konstantin在他的注释中提到的那种过早优化 - std :: string提供了自己的哈希代码函数,它应该适合大多数用例。只有当您发现散列变得太慢时,才能找到更快的方法。

由于所有字符串都是硬编码的,因此您可能需要查看完美的哈希值,例如: G。在gperf变体中。

答案 1 :(得分:0)

  1. Ans :是的,您可以使用自己的哈希函数将字符串用作键或int,也可以使用Rabin-Karp算法。

  2. Ans :是的,您可以考虑散列冲突。

  3. Ans :std :: unordered_map -Average Case - O(1)但最差情况为O(n) 你可以使用Rabin-Karp算法。它需要O(1)时间。