一、简介
STL(Standard Template Library)中的序列容器是一种线性容器,它们按照元素的插入顺序来存储数据。序列容器的典型操作包括在容器的前端或后端添加或删除元素,以及在容器中的任意位置插入或删除元素。STL序列容器的特点是它们提供了对元素的快速随机访问能力,这意味着可以通过索引来直接访问容器中的元素。
二、类型
1.vector
:
(1)简介:
array<T,N>(固定数组):表示可以存储 N 个 T 类型的元素,是 C++ 本身提供的一种容器。此类容器一旦建立,其长度就是固定不变的,这意味着不能增加或删除元素,只能改变某个元素的值;
(2)特点:
可变大小数组,支持快速随机访问,但在非尾部位置插入或删除元素的成本较高。
2.deque
:
(1)简介:
deque<T>(双端队列):和 vector 非常相似,区别在于使用该容器不仅尾部插入和删除元素高效,在头部插入或删除元素也同样高效,时间复杂度都是 O(1) 常数阶,但是在容器中某一位置处插入或删除元素,时间复杂度为 O(n) 线性阶;
(2)特点:
双端队列,支持快速随机访问,并且在两端插入或删除元素的操作效率很高。
3.list
:
(1)简介:
list<T>(双向链表):是一个长度可变的、由 T 类型元素组成的序列,它以双向链表的形式组织元素,在这个序列的任何地方都可以高效地增加或删除元素(时间复杂度都为常数阶 O(1)),但访问容器中任意第几个元素的速度要比前三种容器慢,这是因为 list<T> 必须从第一个元素或最后一个元素开始访问,需要沿着链表移动,直到到达想要的元素。
(2)特点:
双向链表,支持在任何位置进行高效的插入和删除操作,但不支持随机访问。
4.forward_list
:
(1)简介:
forward_list<T>(单向链表):和 list 容器非常类似,只不过它以单向链表的形式组织元素,它内部的元素只能从第一个元素开始访问,是一类比list快、更节省内存的容器。
(2)特点:
单向链表,只支持单向顺序访问,适合在单方向上进行迭代和操作。
5.array
:
(1)简介:
array<T,N>(固定数组):表示可以存储 N 个 T 类型的元素,是 C++ 本身提供的一种容器。此类容器一旦建立,其长度就是固定不变的,这意味着不能增加或删除元素,只能改变某个元素的值;
(2)特点:
固定大小数组,支持快速随机访问,但不能动态增减元素数量。
三、共同操作
STL序列容器共享一系列通用操作,包括构造函数、析构函数、拷贝控制操作(如赋值和交换)、大小管理(如size
, empty
, resize
)、元素访问(如operator[]
, at
, front
, back
)、插入和删除操作(如insert
, emplace
, erase
)以及迭代器相关操作(如begin
, end
, rbegin
, rend
)。
四、应用场景
- 使用
vector
时,如果经常在容器的末端添加或删除元素,并且需要频繁随机访问元素,则vector
是一个不错的选择。
- 如果需要在容器的两端进行频繁的插入和删除操作,
deque
可能更加适合。
- 当需要在容器的任意位置进行频繁的插入和删除操作,并且不需要随机访问时,
list
或forward_list
可能是更好的选择。
array
适用于当容器大小在编译时已知且固定不变的情况。
string
适用于处理文本数据,它提供了针对字符序列优化的操作。