Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 哈希映射、字符串比较和std::map?_C++_Hashmap - Fatal编程技术网

C++ 哈希映射、字符串比较和std::map?

C++ 哈希映射、字符串比较和std::map?,c++,hashmap,C++,Hashmap,首先,我想说几点我认为是正确的。请问这些可以核实吗 哈希映射按顺序存储字符串 将它们转换为整数 不知怎么的 STD::MAP不是哈希图,如果我使用字符串,我应该考虑使用哈希映射来处理内存问题? 字符串比较不好依赖 如果STD::MAP不是哈希映射,我不应该依赖字符串比较(基本上,我有一个带字符串的映射作为键……我被要求用哈希映射来查找)?C++中有没有散列图?如果没有,那么Boost呢 第二,对于[最初]一个std::map,哈希映射值不值得 我想我的观点是让大家明白…我计划有一个不同游戏

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

  • 哈希映射按顺序存储字符串 将它们转换为整数 不知怎么的
  • STD::MAP不是哈希图,如果我使用字符串,我应该考虑使用哈希映射来处理内存问题?
  • 字符串比较不好依赖

如果STD::MAP不是哈希映射,我不应该依赖字符串比较(基本上,我有一个带字符串的映射作为键……我被要求用哈希映射来查找)?C++中有没有散列图?如果没有,那么Boost呢

第二,对于[最初]一个
std::map
,哈希映射值不值得

我想我的观点是让大家明白…我计划有一个不同游戏状态的商店,我可以查找并注册到工厂。 如果需要更多信息,请询问


谢谢你的时间。

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

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

  • 映射被实现为一个平衡树,而不是一个哈希表。使用带有字符串的映射类型作为键或数据时,不会出现“内存问题”

  • 在这两种情况下,字符串都不会存储为数字-无序的_映射将使用哈希函数从字符串派生数字键,但不会存储该键

  • 我的经验是无序映射的速度大约是映射速度的两倍-它们具有基本相同的界面,因此您可以使用自己的数据尝试这两种方法-无论何时您对性能感兴趣,您都应该使用自己的真实数据进行测试,而不是依赖他人的经验。这两种映射类型对字符串键的长度都比较敏感

假设您有一些要通过字符串键访问的A类,映射将声明为:

map <string, A> amap;
unordered_map <string, A> umap;
map-amap;
无序地图umap;

哈希映射通常具有字符串的整数表示,是的

map需要排序,所以不太可能将其实现为哈希表,我在实践中从未见过它

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

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


对于游戏州来说值得吗?是的,但这只是因为使用无序的_图很简单。在此阶段,您过早地担心优化问题。省去对访问模式的担忧,因为你将每秒查找数千次(即当你的分析器告诉你这是个问题时)。

我做了一个基准测试,比较std::map和boost::unordered\u map。 我的结论基本上是这样的:如果您不需要像equal_range这样特定于map的东西,那么请始终使用boost::unordered_map。
可以找到完整的基准测试

STL扩展中有一个哈希映射,stdext::hash_映射。