到处都声明,所有顺序容器的共同属性是可以按顺序访问元素。但我们知道std::array
、std::vector
和std::deque
都支持对元素的快速随机访问。std::list
支持双向迭代,而std::forward_list
仅支持单向迭代。
那么,这里的"按顺序访问"实际上是什么意思呢?
序列容器要求其元素以定义明确、确定的顺序存储,以便像front()
这样的函数或对其第 n 个元素的引用是有意义的。允许顺序访问这一事实并不排除也允许随机访问。
相反,不要求关联容器的元素以任何特定顺序存储。因此,例如,尝试对std::set
对象调用front()
是没有意义的。
顺序访问与随机访问或迭代器关系不大。
例如,std::set
的迭代器是一个双向迭代器。您可以像迭代std::vector
的元素一样循环访问std::set
的元素。
序列容器有正面和背面,它们的所有元素都位于它们之间,按照您插入它们的顺序。将其与std::set
进行对比, 在概念上确实具有正面和背面(最小值和最大值(,但它按比较函数定义的顺序存储其元素。与此形成对比的是std::unordered_set
,它实际上没有正面和背面,并且按哈希函数确定的顺序存储其元素。最后,将其与std::stack
进行对比,它只有一个顶部(概念上是背面,但没有正面(。
唯一具有正面和背面并按照插入元素的顺序存储其元素的其他标准容器是std::queue
.但是,如果不访问和删除队列前面的所有元素,则无法访问队列中的任何任意元素。
因此,如果我必须给出序列容器的定义,它将是一个具有顺序访问的容器,这意味着按照您插入它们的顺序访问其任何元素,而无需执行任何迭代之外的操作。因此,您可以对序列容器进行排序。
不要与连续(或随机(访问混淆。
也就是说,这不是一个非常有用的分类。更有用的类别是迭代器和操作复杂性的类别。