哈希映射,字符串比较和std :: map?

The*_*uck 0 c++ hashmap

首先,我想提出一些我认为是真实的观点.请问这些可以验证吗?

  • 哈希映射通过以某种方式将它们转换为整数来存储字符串.
  • std :: map不是哈希映射,如果我使用字符串,我应该考虑使用哈希映射来解决内存问题?
  • 字符串比较不好依赖.

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

其次,哈希图是否值得[原创] std::map< std::string, non-POD GameState >

我认为我的观点正在实现......我计划拥有一个不同游戏状态的商店,我可以查看并注册到工厂.如果需要更多信息,请询问.

谢谢你的时间.

小智 10

我不相信你的大多数观点是正确的.

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

  • std :: map实现为平衡树,而不是哈希表.使用带字符串的地图类型时,没有"内存问题",无论是作为键还是数据.

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

  • 我的经验是unordered_map的速度大约是map的两倍 - 它们基本上具有相同的界面,所以你可以尝试使用自己的数据 - 每当你对性能感兴趣时,你应该总是用自己的真实数据进行测试,而不是而不是取决于他人的经验.两种映射类型都会对字符串键的长度有些敏感.

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

map <string, A> amap;
unordered_map <string, A> umap;
Run Code Online (Sandbox Code Playgroud)


小智 8

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