C++ 已订购和未订购的STL集装箱

C++ 已订购和未订购的STL集装箱,c++,stl,C++,Stl,有序和无序STL容器之间有什么区别?主要区别在于,如果通过递增迭代器对有序容器进行迭代,则将按照键的顺序访问容器的元素 这不一定适用于无序容器。无序集合(tr1::unordered\u map和tr1::unordered\u set)通常通过哈希表实现检索值。这使得摊销平均查找值为O(1) 有序集合(std::map和std::set)基于节点。这些集合以O(log)时间检索值。有序STL容器基于比较。例如,std::set通常实现为红黑树。无序STL容器基于哈希算法,无序集合是一个哈希表

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

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

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

无序集合(
tr1::unordered\u map
tr1::unordered\u set
)通常通过哈希表实现检索值。这使得摊销平均查找值为O(1)


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

有序STL容器基于比较。例如,std::set通常实现为红黑树。无序STL容器基于哈希算法,无序集合是一个哈希表

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


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

首先:我假设您谈论的是
std::(map | set)
与0x
std::unordered(map | set)
,首先,显而易见的一点是:有序的容器保持其内容——很好,是有序的。这意味着在插入某些内容时需要额外的工作(因为必须先找到插入的位置)。但是,您只需要指定(如果不是内置的,就像许多内置类型一样)如何比较两个元素(即,如果一个元素小于另一个)。无序容器不需要对其内容进行排序,插入和元素访问速度更快,但您需要(对于自定义类型)提供一个好的哈希函数和一个平等性测试函数,因此您需要付出更大的努力。

在其他回复中,还有一件事被忽略了。有序容器需要严格的弱排序,或者使用
操作符将有序和无序传递应用于容器

您感兴趣的是序列,即当您迭代容器(可能是容器的一部分)时元素的出现顺序

但是序列更一般,所以对于这种概念,我将参考(当前STL的母亲),当人们可以找到隐藏在STL后面的不同概念的分类法时

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

1是一个容器,它的标准顺序是固定的,这保证了每当迭代其元素的某个片段时,您总是会遇到根据该标准排序的元素

另一方面,A是不同的。它使用散列而不是排序标准。SGI STL也必须使用桶,这是一种限制。这里的迭代基本上是无序的。您完全无法控制元素将如何释放,如果将某种随机性应用于重新灰化,那么从一个程序运行到另一个程序运行可能确实是不同的

无序容器是他们为Boost和C++0x提出的术语,因为他们不希望名称与已有的
hash\u集
hash\u映射
的实现冲突。因此,尽管在SGI STL中没有记录,但无序类近似于之前的散列类

您真正需要知道的是:有序意味着元素将被排序,而无序意味着没有任何形式的顺序(根本)被强制执行。订单是有成本的,所以一定要在你需要的时候才付款。例如,Python
dict
实际上是无序的



我真的不喜欢这里的联想这个词。当一个“<代码>设置/代码>是这个需求的模型时,它有点误导,除了一个元素之外,一个元素同时是键和值…

, 2个无序容器(非元素)的相等性测试很困难,因为 它的无序性。
这是可能的,但可能很昂贵

不仅是检索,还有插入。如果容器没有键,迭代器将按排序顺序访问元素。答案中的链接不再有效;你能确认/否认这些内容是吗?@EnricoMariaDeAngelis:谢谢你的通知,谢谢你找到一个新的链接。我已经更新了链接:(意见):默认情况下,我更喜欢使用无序容器,因为它们从算法的角度来看有更好的效果(通常),通常当我使用C++时我想要速度。另外,因为从无序到有序很简单,反之亦然:如果您围绕有序设计代码,您最终将在其他地方使用该属性,在测试、显示等中,而您不需要它,而返回无序将涉及使用有序属性更改所有代码。(再次强调,这只是针对您的默认使用给出另一个POV,而不是绝对真理^^)