容器实现数据结构,迭代器类似指针将容器的元素与算法关联
头文件
#include<iterator> //迭代器
#include<iostream> //标准输入输出流
#include<fstream> //文件输入输出流
#include<sstream> //字符串输入输出流
#include<string> //字符串
#include<functional> //函数对象
#include<vector> //向量 动态数组
#include<deque> //双端队列
#include<queue> //队列、优先队列
#include<list> //链表
#include<stack> //堆栈
#include<set> //集合、多集合、位集合
#include<map> //映射、多映射
#include<algorithm> //通用算法
#include<numeric> //数值算法
模板:函数模板和类模板
STL思想:
- 形成容器元素
- 取出迭代指针
- 调用通用算法
算法通过迭代器存取容器内容
迭代器类型:输入、输出、前向、双向、随机访问迭代器
顺序性容器:
名字 | 叙述 |
---|---|
vector | 从后面快速的插入与删除,直接访问任何元素 |
deque | 从前面或后面快速的插入与删除,直接访问任何元素 |
list | 双链表,从任何地方快速插入与删除 |
关联容器:
名字 | 叙述 |
---|---|
set | 快速查找,不允许重复值 |
multiset | 快速查找,允许重复值 |
map | 一对多映射,基于关键字快速查找,不允许重复值 |
multimap | 一对多映射,基于关键字快速查找,允许重复值 |
容器适配器:
名字 | 叙述 |
---|---|
stack | 后进先出 |
queue | 先进先出 |
priority_queue | 最高优先级元素总是第一个出列 |
并联、关联容器有下列函数:
名字 | 叙述 |
---|---|
begin() | 返回容器第一个元素迭代器指针 |
end() | 最后一个元素后面一位 |
Rbegin() | 最后一个元素 |
Rend() | 首个元素前面一位 |
Erase() | 清除几个元素 |
Clear() | 清除所有元素 |
- vector容器是动态数组,在堆中分配内存,元素连续存放,有保留内存。若减少大小后内存也不会释放,当元素个数大于当前容量时,会分配原来2倍容量,从而将元素复制到新空间,原空间释放。可以快速随机访问元素,快速在末尾插入删除元素,此过程中不用移动内存;对中间元素插入删除时要移动内存。若元素是结构体类型或类,移动内存时还要进行构造和析构操作。vector可以使用[]操作符。
- deque是双端队列,可以快速地随机访问元素,快速地在开始和末尾插入删除元素。随机插入比两端插入要慢,重新分配内存比vector要快。重新分配空间后,原空间保持,只是新建立了一个内存块,将新数据插入这个内存块,没有空间的复制删除过程,故deque是由多个分段连续的内存空间组成。因此,deque在某一位置上的操作是线性的,各小片内存间用链表相连,还是可以使用[],只是没有vector快。对deque排序,可以将其复制到vector中排完序后再复制回去。
- list是一种双线性列表,只能顺序访问,不支持随机访问。对每个元素分配空间,不存在空间不够和重新分配的情况。
- set是集合,支持快速查找,不允许有重复值,用平衡树结构来存储;multiset支持快速查找,允许有重复值。
- map是映射,一对一映射,支持关键字快速查找,不允许有重复值;multimap是一对多映射,基于关键字查找,允许有重复值。