有序和无序适用于容器传递。
您感兴趣的是序列,即当您迭代容器(可能是容器的一部分)时元素出现的顺序。
不过,序列更为笼统,因此对于这种概念,当人们可以找到隐藏在 STL 背后的不同概念的分类法时,我将参考Martin Broadhurst 的 SGI STL 网站副本(当前 STL 之母)。
首先,序列。该序列的有趣之处在于,不能保证两次遍历它而不同时改变它会产生相同顺序的元素。例如,通过将最后一个元素移动到开头来实现某种形式的缓存的容器就是这种情况。在这种情况下,迭代将有效地反转容器。
有序关联容器1是一个标准顺序已固定的容器,并且保证每当迭代其元素的切片时,您总是会遇到根据此标准排序的它们。
另一方面,散列关联容器则不同。它使用散列代替排序标准。SGI STL 还明确它必须使用桶,这是一种限制。这里的迭代基本上是无序的。您完全无法控制元素如何退出,并且如果将某种随机性应用于重新散列,则程序的一次运行与另一次运行确实可能不相同。
无序容器是他们为 Boost 和 C++0x 提出的术语,因为他们不希望这个名称与hash_set
和的现有实现发生冲突hash_map
。因此,尽管 SGI STL 中没有记录,但无序类型近似于之前的哈希类型。
您真正需要知道的是:有序意味着元素将排序,而无序意味着不强制执行任何类型的顺序。订单需要付费,因此请确保仅在需要时才付款。例如,Pythondict
实际上是无序的。
1我不太喜欢这里的“联想”这个词。set
当人们认为 a是此需求的模型时,这有点误导,其中元素既是键又是值......
有序 STL 容器基于比较。例如, std::set 通常实现为红黑树。无序 STL 容器基于哈希算法,unordered_set 是一个哈希表。
无序容器通常为插入、查找和删除等操作提供更好的算法成本。但是,它们的恒定成本非常高,并且在某些情况下,自定义类型的散列可能非常重要。以特定顺序遍历无序容器也是不可能的。
通常,我会在大多数用途中使用有序容器,除非确定容器的性能有问题,因为为自定义类型扩展它们通常更简单。