【问题标题】:Hash map, string compares, and std::map?哈希映射、字符串比较和 std::map?
【发布时间】:2010-08-01 10:54:10
【问题描述】:

首先,我想说几点我认为是正确的。请问这些可以验证吗?

  • 哈希映射通过以下方式存储字符串 将它们转换为整数 不知何故。
  • std::map 不是哈希映射,如果我使用字符串,是否应该考虑使用哈希映射来解决内存问题?
  • 字符串比较不可靠。

如果 std::map 不是哈希映射并且我不应该依赖字符串比较(基本上,我有一个带有字符串作为键的映射......我被告知要使用哈希映射来查找?),是C++ STL 中有哈希映射吗?如果没有,那么 Boost 怎么样?

其次,对于 [最初] std::map< std::string, non-POD GameState >,哈希映射是否值得?

我认为我的观点已经传达了...我计划建立一个存储不同游戏状态的商店,我可以查找并注册到工厂。 如果需要更多信息,请询问。

感谢您的宝贵时间。

【问题讨论】:

  • STL扩展中有一个hash map,stdext::hash_map。

标签: c++ hashmap


【解决方案1】:

我不相信你的大部分观点都是正确的。

  • 当前标准中没有哈希映射。 C++0x 引入了 unordered_map,它的实现将是一个哈希表,你的编译器可能已经支持它。

  • std::map 被实现为平衡树,而不是哈希表。将任一映射类型与字符串(作为键或数据)一起使用时,不存在“内存问题”。

  • 在任何一种情况下,字符串都不会存储为数字 - unordered_map 将使用散列函数从字符串中派生数字键,但这不会存储。

  • 我的经验是 unordered_map 的速度大约是 map 的两倍 - 它们具有基本相同的界面,因此您可以使用自己的数据尝试两者 - 每当您对性能感兴趣时,您应该始终执行自己的测试自己的真实数据,而不是依赖别人的经验。两种映射类型都会对字符串键的长度有些敏感。

假设你有一些 A 类,你想通过一个字符串键访问,映射将被声明为:

map <string, A> amap;
unordered_map <string, A> umap;

【讨论】:

    【解决方案2】:

    我做了一个比较 std::map 和 boost::unordered_map 的基准测试。 我的结论基本上是这样的:如果你不需要像 equal_range 这样的特定于地图的东西,那么总是使用 boost::unordered_map。 可以在here找到完整的基准测试

    【讨论】:

      【解决方案3】:

      哈希映射通常具有字符串的某种完整表示,是的。

      std::map 需要排序,因此不太可能将其实现为哈希表,而且我在实践中从未见过。

      字符串比较的好坏完全取决于您在做什么、您要比较的数据以及频率。例如,如果第一个字母不同,那么这与整数比较几乎没有什么不同。

      您想要unordered_map(这是 Boost 版本 - 如果您的编译器有,TR1 标准库中也有一个版本)。

      对于游戏状态是否值得?是的,但这只是因为使用 unordered_map 很简单。在这个阶段你过早地担心优化。不必担心每秒要查找数千次的访问模式(即当您的分析器告诉您这是一个问题时)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-27
        • 1970-01-01
        • 2015-03-07
        • 2021-03-26
        • 1970-01-01
        • 2019-09-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多