16.4.5 容器种类(外1:7种序列容器类型)
1.vector模板:
- 在vector头文件声明
- ### 在尾部添加和删除元素的时间是固定的,但在头部
- ### 或中间插入和删除元素的复杂度为线性时间
- vector是可反转容器概念的模型。由此增加两个类方法:
- rbegin():返回一个指向反转序列的第一个元素的迭代器
- rend():返回反转序列的超尾迭代器
2.deque模板(双端队列):
- 在deque头文件种声明
- ### 在STL中,其实现类似于vector容器,支持随机访问。主要区别在于
- ### 从deque对象的开始位置插入和删除元素的时间是固定的,而不像vector中那样是线性时间的
- ### 因此如果多数操作是发生在序列的起始和结尾处,则应考虑使用deque数据结构
- ### 以上实现的代价是,增加了设计的复杂度,所以尽管二者都提供对元素的随机访问和在序列中部执行线性
- ### 时间的插入和删除操作,但vector容器执行这些操作时速度要快些
3.list模板(双向链表):
- 在list头文件中声明
- ### list和vector之间关键的区别在于,list在链表中任一位置进行插入和删除的时间都是固定的
- ### 因此vector强调的是通过随机访问进行快速访问,而list强调的是元素的快速插入和删除
- 与vector相似,list也是可反转容器
- 与vector不同的是,list不支持数组表示法和随机访问
- 与矢量迭代器不同,从容器中插入或删除元素后,链表迭代器指向的元素将不变
除序列和可反转容器的函数外,list模板类还包含了链表专用的成员函数,部分如下(通常不必担心
Alloc模板参数,因为它有默认值):
一些list成员函数
函数 | 说明 |
void merge(list<T, Alloc> & x) |
将链表x与调用链表合并。两个链表必须已经排序。合并后的经过排序的链表(合并后自动排序)保存在 调用链表中,x为空。这个函数的复杂度为线性时间 |
void remove(const T & val) | 从链表中删除val的所有实例。这个函数的复杂度为线性时间 |
void sort() | 使用<运算符对链表进行排序;N个元素的复杂度为NlogN |
void splice(iterator pos, list<T, Alloc> x) | 将链表x的内容插入到pos的前面,x将为空。这个函数的复杂度为固定时间 |
void unique() | 将连续的相同元素压缩为单个元素。这个函数的复杂度为线性时间 |
说明:### 一:insert()和splice()之间的主要区别在于:insert(0将原始区间的副本插入到目标地址,而splice()则将原始区间移动目标地址
### 二:splice()方法执行后,迭代器仍有效(指向同一个元素)
### 三:使用非成员sort函数需要随机访问迭代器。因快速插入放弃了随机访问功能,所以不能用,转而使用类中的成员版本
### sort()、merge()、unique()方法还各自拥有接受另一个参数的版本,该参数用于指定用来比较元素的函数。
### remove()方法也有一个接受另一个参数的版本,该参数用于指定用来确定是否删除元素的函数
### 上述两个参数都是谓词函数
4.forward_list模板(单向链):
- C++11新增
- 实现单链表:单向,只需要正向迭代器
- 不可反转
5.queue模板:
- 在头文件queue(以前为queue.h)中声明
- ### 是一个适配器类(ostream_iterator模板也是一个适配器类,让输出流能够使用迭代器接口)
- ### queue模板让低层类(默认为deque)展示典型的队列接口
- 限制比deque多:
- 不允许随机访问
- 不允许遍历队列
- ### 它把使用限制在队列的基本操作上
- ### queue的操作:
-
bool empty() const 如果队列为空,则返回true;否则返回false size_type size() const 返回队列中元素的数目 T & front() 返回指向队首元素的引用 T & back() 返回指向队尾元素的引用 void push(const T & x) 在队尾插入x
void pop() 删除队首元素
6.priority_queue模板:
- 在queue头文件中声明,是另一个适配器类
- 支持的操作与queue相同
- ### queue与queue的主要区别在于,在priority_queue中,最大的元素被移到队首。
- ### 内部区别在于,priority_queue默认的底层类是vector
### 可以修改用于确定哪个元素放到队首的比较方式,方法是提供一个可选的构造函数参数:
priority_queue<int> pq1; // default version priority_queue<int> pq2(greater<int>); // use greater<int> to order
### greater<>()函数是一个预定义的函数对象
7.stack模板(栈):
- 在头文件stack(以前为stak.h)中声明
- 与queue相似,它也是一个适配器类,它给底层类(默认为vector)提供了典型的栈接口。
- 限制多余vector:
- 不支持随机访问栈元素
- 不能遍历栈
- 仅支持栈的基本操作:
- stack的操作
-
方法 说明 bool empty() const 如果栈为空,则返回true;否则则返回false size_type size() const 返回栈中的元素数目 T & top() 返回指向栈顶元素的引用 void push(const T & x) 在栈顶部插入x void pop() 删除栈顶元素
array模板(C++11):
- 在头文件array中定义
- 非STL容器(原因是长度固定,没有调整大小的操作)