所谓序列式容器,表示其中的元素都是可以排序的,但未必是有序的。
C++本身提供了一个序列式容器数组array,STL另外有vector,list,deque,stack,queue,priority-queue等等序列式容器。stack和queue由于只是将deque封装得到的,技术上被归类为一种适配器(adapter)。
vector
vector与array在数据安排和操作方式上很相似。两者的唯一差别在于是否可以动态分配空间。array是静态空间,一旦配置了就不能改变,也就是说一旦配置了array的大小,如果向换个更大的,那么你就得重新自己来配置一个更大的空间,将元素从旧址拷贝到新的地址,再把原来的空间返还给系统。
vector是动态空间,随着元素的增加,它内部会自行拓展新的空间容纳新的元素。因此,vector的运用对于内存的合理利用和灵活性很有用。
vector采用的数据结构是线性连续空间,为了降低空间配置时的速度成本,vector实际配置的大小可能比客户端需求量更大些。所谓的动态增加大小,并不是在原空间之后拓展连续的空间,而是以原空间的两倍另外配置一个空间(若不够继续拓展),将原内容拷贝过来,并且释放原空间(重新配置、移动数据和释放原空间的过程)。
list
相比vector,list则要复杂很多,它的好处是每次插入或者删除一个元素,就配置和释放一个空间。这对于空间的要求很准确,对于任何位置的元素插入和元素移除,list永远是常数时间。list有双向链表(double linked-list)和单向链表(single linked-list)之分。
slist和list的主要差别在于,前者的迭代器属于单向,后者的迭代器属于双向。因此slist的功能自然受到了很多限制。其中一个就是slist除了起点处附近的区域之外,在其他位置上采用insert或erase操作函数都属于不智之举(迭代器是单向的)。
双向链表
list相较与vector,插入和结合操作都不会造成原有的list迭代器失效。双向链表一般一个节点有两个指针分别指向前一个节点和后一个节点,节点的内容为元素值。
deque
vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间。所谓双向开口,就是可以在头尾两端分别做元素的插入和删除处理。从技术上看vector也可以实现,但在头部操作的效率极差。
deque允许常数时间对开口起始端进行元素的插入或移除操作,deque是动态以分段连续空间组成的所以没有容量这个概念。,随时可以增加一段新的空间并链接起来。
deque是由一段一段的定量连续空间构成。一旦有必要在deque的前端或尾端增加新空间,便配置一段定量连续空间,串连在其头部或尾部。
stack
stack是一种先进后出(First In Last Out,FILO)的数据结构。它只有一个出口。stack允许新增、移除和取最顶端元素。但是除了最顶端之外,没有任何其他方法存取stack的其他元素。
将现有的某种容器作为基础,将其接口改变,使之符合先进后出的特性,形成stack是很简单的。deque是双向开口的数据结构,以deque为底部结构并封闭其头端开口便形成了一个stack,同时若以list为底部结构并封闭其头端开口,一样能得到一个stack。
由于stack是以底部容器完成其工作的,而这种具有“修改某容器接口,形成另一种特性”的特点的容器,称为adapter(配接器),所以,stack往往被归类为container adapter(容器适配器)。
queue
queue是一种先进先出(First In First Out,FIFO)的数据结构。它有两个出口,queue允许新增、删除、从最底部加入和去最顶端元素。但除了最底端可以加入、最顶端可以取之外,没有存取其他元素的方法。
与stack相同,将现有的某种容器作为基础,将其接口改变,使之符合先进后出的特性,形成queue是很简单的。deque是双向开口的数据结构,以deque为底部结构并封闭其底端的出口和前端的入口便形成了一个queue,同时若以list为底部结构并封闭其底端的出口和前端的入口,一样能得到一个stack。
priority-queue
priority-queue优先队列,是一种拥有权值观念的queue,具有插入,删除,审视元素等功能。因为是一个queue,所以只允许在底端加入元素,并在顶端取元素。
priority-queue带有权值概念,内部的元素并非按照被push的次序排列,而是自动依照元素的权值排列。权值高者在前(一般权值以实值表示)。
priority_queue完全以底部容器为根据,缺省情况下是以vector为底部容器,所以被归类为container adapter。
序列式容器简介
最新推荐文章于 2024-06-14 20:02:38 发布