我想创建一个std::unordered_map < int, std::string >
或std::unordered_map< std::string, int >
。
在这个地图中,我将存储字符串及其整数表示。
我只会在代码中填写此地图(硬编码对)。
我需要将输入字符串转换为它们的int值 - 在map中查找。 所以我只需要在运行时搜索地图。 此时我需要在转换时获得最佳性能。 在最好的情况下 - O(1)。
我的问题:
答案 0 :(得分:1)
std::map
或std::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)
Ans :是的,您可以使用自己的哈希函数将字符串用作键或int,也可以使用Rabin-Karp算法。
Ans :是的,您可以考虑散列冲突。
Ans :std :: unordered_map -Average Case - O(1)但最差情况为O(n) 你可以使用Rabin-Karp算法。它需要O(1)时间。