答案 0 :(得分:6)
C ++ 0x / TR1还提供了unordered_map
,它通常被实现为哈希映射。
差异有两方面:
密钥类型。在有序映射中,密钥类型必须遵循严格的弱排序,并且条目按该顺序维护。在无序映射中,键类型必须是相等的,并且您必须提供散列函数h
,以便h(Key)
返回size_t
[感谢Steve Jessop的澄清]。
访问复杂性:有序地图中的插入/删除/查找是地图大小n中的O(log n)。在无序映射中,它通常是“O(1)”,但最坏情况的行为是O(n)(例如,如果所有键映射到相同的散列值)。
因此,有序地图提供了总体复杂性保证,而无序地图在良好情况下提供了(更好)复杂性 ,具体取决于哈希函数的质量。
无序地图的内部实现复杂性大于有序地图的内部实现复杂性,但您可以想象您获得了更好的访问复杂性,因为您获得的功能更少,即您无法免费进行排序。这是一个经典的权衡。
另一点:实际上,如果弱排序运算符计算起来很昂贵,就像字符串一样,无序映射实际上可能会快得多,因为对散列类型的比较非常快。另一方面,如果您的密钥类型是具有普通散列函数的密钥类型(如任何内置整数类型),并且如果您不需要排序,请考虑使用无序容器。
答案 1 :(得分:1)
散列表提供非常快速的搜索访问和对象的插入/删除......此类操作的复杂性平均为O(1),意味着持续时间。这两个操作的主要限制是散列算法的速度(对于非POD的某些类型的对象,这些可能有点复杂,并且需要更多时间来避免两个不同对象散列到的“冲突”。相同的价值)。哈希表的主要缺点是需要大量额外空间。
另一方面,二进制树的插入和搜索时间相对较快,删除和对象的复杂性与插入相同。由于二叉树的工作方式,每个节点有两个以上的子节点,搜索和访问时间(以及插入和删除)需要O(log N)时间。因此,binaty树比哈希表“慢”,但实现起来并不复杂(尽管平衡二叉搜索树比不平衡树更复杂)。
二叉搜索树的另一个好处是,您可以通过将容器从“first”元素迭代到“last”元素,获取对象的排序列表,其中 - 与hash-map一样,该列表不会被排序。因此,插入的额外时间还考虑了二叉搜索树是排序插入的面。例如,对一组N个项目的快速排序的复杂性与为同一组N个项目构建平衡二叉搜索树(即,红/黑树)的复杂性相同。两个操作都是O(N log N)。