C++ hashtable和map的使用

C++ hashtable和map的使用,c++,C++,hashtable和map是hashtable是作为哈希函数实现的,而map是作为树实现的 我的问题是,在什么情况下,不能使用哈希表,但必须使用映射?当您取决于键是否已排序时。我将回答std:(哈希表)和std:(树)。请注意,这两种方法实际上都没有指定实现机制。基本上,当您需要按排序顺序访问键时,可以使用map,否则使用无序的_map 选择在哈希表上使用映射的一个动机是每个映射对模板实例化中使用的键类型的约束。如中所述,实例化hash_映射需要提供一个对K进行散列的函子。STL包含一个函子,该

hashtable和map是hashtable是作为哈希函数实现的,而map是作为树实现的


我的问题是,在什么情况下,不能使用哈希表,但必须使用映射?

当您取决于键是否已排序时。

我将回答std:(哈希表)和std:(树)。请注意,这两种方法实际上都没有指定实现机制。基本上,当您需要按排序顺序访问键时,可以使用map,否则使用无序的_map

选择在哈希表上使用映射的一个动机是每个映射对模板实例化中使用的键类型的约束。如中所述,实例化hash_映射需要提供一个对K进行散列的函子。STL包含一个函子,该函子可以执行此操作,但它仅针对有限的一组类型T实现


另一方面,std::map的实例化只需要一个比较K类型对象的函子来生成弱排序。标准函子适用于定义运算符的任何T,可能有许多原因

  • 当不可能或至少不实际为密钥提供合理的哈希函数时
  • std::map
    指定的顺序是必要的或可取的时
  • 当您只能访问标准库,并且只能使用其他库时
运行时特征不同:

基于树的映射总是有一个运行时(最坏情况,平均情况),顺序为O(logn),即(平衡的)二叉搜索树的高度

另一方面,散列映射的运行时行为要复杂得多。但在通常情况下,哈希表的预期运行时间为O(1),即恒定开销


一般来说,最坏的情况是O(n),听起来很糟糕。然而,可以证明,对于一个好的参数选择,这种最坏的情况变得非常罕见,以至于在实践中无法发挥作用。“稀有”在这里的意思是真正的稀有,如连续十次中彩票,然后被彗星杀死。实际上,参数选择不当(散列技术、负载因子…)会大大提高这种可能性。

如果需要在数据结构中找到“下一个”项,无法使用哈希表,因为它不以可遍历的顺序保存项。

潜在的重复:哈希映射将作为std::unordered包含在C++0x中_map@gareth-std::无序_图已作为TR1的一部分广泛提供(GCC/VS08)。此外,使用Boost.hash库为自定义类型生成哈希键也很简单,将来应该标准化(可能在TR2中?)