概述
STL=standard template library是 C++ 标准库的一部分,无需单独安装,只需#include 头文件
什么是模板?见c++面向对象程序设计中模板一节
顺序性容器
vector 向量 变长数组
声明
vector<类型名> 变量名[数组长度];
类型名可以是已有类型或自定义结构体,也可以是STL容器。
如二维数组:在两个方向上都是变长的
vector<vector<int> > v;//注意:> >之间要加空格
访问
下标访问 v[i]
迭代器访问
vector<int>::iterator it=v.begin();
it[i];
*(it+i)
操作函数
- v.push_back(x) 在vector后追加元素x
- v.pop_back() 删掉最后一个元素
- v.size() 返回vector的长度,时间复杂度O(1)
- v.clear() 清空容器,复杂度O(n)
- v.insert(要插入的地址,要插入的元素) 地址要写v.begin()+i的形式,其他的元素依次后移
- v.erase(v.begin()+i)删除某位置的元素
- v.erase(v.begin()+i,v.begin()+j)删除某区间的元素,左闭右开
deque 双端队列
list 双向循环链表
关联式容器
每一个元素都有一个键值(key),对于二元关联容器,还拥有实值(value),容器中的元素顺序不由程序员决定,有set(集合)和map(映射)这两大类,它们均以RB-Tree(red-black tree,红黑树)为底层架构。
set 集合
自动递增排序且不含重复元素
声明
set<类型名> 变量名;
访问
只能通过迭代器,只能依次枚举,不能下标访问
除了vector和string之外的STL容器都不支持*(it+i)的访问方式
常用函数
s.insert(x) 插入元素x
s.find(x) 返回的是迭代器(指针)
s.erase(it) O(1)删除某元素
s.erase(x) O(logN)删除某元素
s.erase(iteratorBegin , iteratorEnd)删除一个区间内的所有元素,左闭右开
s.size() O(1)获取元素个数
multiset 可重集合是set的升级版,元素可以重复
map 映射
在构造时需要写两个参数类型,前者对应key值,后者对应value值,因为有两个参数,因此在插入元素的时候需要配合对组pair进行插入
容器适配器
stack 堆栈
先进后出FILO,只能在一端操作
queue 队列
先进先出FIFO,不能遍历,只能尾进头出
priority_queue 优先队列
默认由小到大排列