有序和无序的STL容器

时间:2011-01-14 19:03:25

标签: c++ stl

有序和无序STL容器之间有什么区别?

7 个答案:

答案 0 :(得分:6)

主要区别在于,如果通过递增迭代器遍历有序容器,则将按键的顺序访问容器的元素。

这不一定适用于无序容器。

答案 1 :(得分:4)

有序STL容器基于比较。例如,std :: set通常实现为红黑树。无序STL容器基于散列算法,unordered_set是散列表。

无序容器通常为插入,查找和删除等操作提供更好的算法成本。但是,它们的固定成本非常高,并且在某些情况下,自定义类型的散列可能非常重要。也无法按特定顺序迭代无序容器。

通常,我会在大多数情况下使用有序容器,除非容器的性能被确定为有问题,因为为自定义类型扩展它们通常更简单。

答案 2 :(得分:3)

有序和无序适用于容器。

您感兴趣的是序列,即迭代容器(可能是片段)时元素出现的顺序。

序列是更一般的,所以对于这种概念,我将引用Martin Broadhurst's copy of the SGI STL website(当前STL的母亲),当人们可以找到潜伏在STL背后的不同概念的分类。

首先,Sequence。序列中有趣的是,无法保证在此期间遍历它两次而不改变它将以相同的顺序产生元素。例如,对于通过移动到最后看到的元素的开头来实现某种形式的缓存的容器就是这种情况。在这种情况下,迭代将有效地反转容器。

Ordered Associative Container 1 是一个容器,其标准顺序已经修复,并且保证每当迭代其元素片时,您将始终遇到根据这个标准。

另一方面,Hashed Associative Container是不同的。它使用散列而不是排序标准。 SGI STL也很精确,它必须使用桶,这是一种限制。这里的迭代基本上是无序的。你完全无法控制元素的运行方式,如果将某种随机性应用于重复运算,那么从一个程序运行到另一个程序运行可能确实不一样。

无序容器是他们为Boost和C ++ 0x提出的术语,因为他们不希望该名称与现有的hash_sethash_map实现冲突{1}}。因此,尽管未在SGI STL中记录,但无序类型近似于之前的哈希类型。

您真正需要知道的是: Ordered 意味着元素将按照 Unordered 排序,这意味着不会强制执行任何类型的订单(根本没有)。订单需要付费,因此请务必在需要时付费。例如,Python dict实际上是无序的。


1 我不太喜欢这里的术语 associative 。当一个人认为set是这个要求的模型时,它有点误导,其中一个元素既是键又是值......

答案 3 :(得分:1)

无序集合(tr1::unordered_maptr1::unordered_set)通常通过哈希表实现来检索值。这给出了O(1)的摊销平均查询。

有序集合(std::mapstd::set)是基于节点的。这些集合以O(log)时间检索值。

答案 4 :(得分:1)

首先:我假设您正在谈论std::(map|set)与0x std::unordered_(map|set)嗯,首先是明显的事情:订购的容器保留其内容 - 好吧,有序。这意味着当您插入某些内容时需要额外的工作(因为您必须先找到插入的位置)。但是,您只需要指定(如果它不是内置的,就像许多内置类型一样)如何比较两个元素(即,如果一个小于另一个)。无序容器不需要对其内容进行排序,插入和元素访问速度更快,但您需要(对于自定义类型)提供良好的散列函数和功能测试以确保相等性,因此您需要更多努力。

答案 5 :(得分:0)

在其他回复中,还有一点被忽略了。有序容器需要使用operator<严格弱序,或使用operator()的Traits类。因此,迭代这些容器是根据这些功能排序的。无序容器只需要Predicate函数的相等比较运算符做同样的操作。因此,容器中没有元素的排序(除桶的内部排序之外)。

答案 6 :(得分:0)

除了其他答案, 由于无法对2个无序容器(非元件)进行平等测试 它的无序性。 这是可能的,但可能很昂贵。