(零)前言
之前学STL一直都是零零散散的,这次想好好梳理一下STL。。
(一)什么是序列式容器?
序列容器,即以线性排列(类似普通数组的存储方式)来存储某一指定类型(例如 int、double 等)的容器。该类容器并不会自动对存储的元素按照值的大小进行排序。
序列式容器包含了哪些容器?
- array<T,N>(数组容器):表示可以存储 N 个 T 类型的元素,是 C++ 本身提供的一种容器。此类容器一旦建立,其长度就是固定不变的,这意味着不能增加或删除元素,只能改变某个元素的值。
- vector<T>(向量容器):用来存放 T 类型的元素,是一个长度可变的序列容器,存储空间不足时,会自动申请更多的内存。使用此容器,在尾部增加或删除元素的效率最高(时间复杂度为 O(1) 常数阶);在其它位置插入或删除元素效率较差(时间复杂度为 O(n) 线性阶,其中 n 为容器中元素的个数)。
- deque<T>(双端队列容器):和 vector 非常相似,区别在于使用该容器不仅尾部插入和删除元素高效,在头部插入或删除元素也同样高效,时间复杂度都是 O(1) 常数阶,在容器中某一位置处插入或删除元素,时间复杂度为 O(n) 线性阶。
- list<T>(链表容器):是一个长度可变的、由 T 类型元素组成的序列,它以双向链表的形式组织元素。可以高效地增加或删除元素(O(1)),访问元素较慢(O(n))。
- forward_list<T>(正向链表容器):和 list 容器非常类似,只不过它以单链表的形式组织元素,它内部的元素只能从第一个元素开始访问,是一类比链表容器快、更节省内存的容器。
注意,其实除此之外,stack<T> (栈容器)和 queue<T> (单端队列容器)本质上也属于序列容器,只不过它们都是在 deque 容器的基础上改头换面而成,通常更习惯称它们为容器适配器,有关它们的介绍,会放到后续章节中。