vector
变长数组
- 初始化方式
- vector
a(10, 3); //初始化,10个3 - vector
a[10]; 声明一个数组
- vector
- 支持的函数
- size() 时间复杂度O(1)
- length() 同size()
- empty()
- clear() 并不是所有的容器都有这个方法
- front(), back()
- push_back(), pop_back()
- begin(), end() 左闭右开
- 支持随机寻址
- 倍增思想 : 尽可能减小向系统申请空间的次数,同时又不能浪费空间;每次当容量不够时,重新申请所需空间两倍的空间,并将原数组copy过来,均摊时间复杂度为O(1)
- 系统为某一程序分配空间所需要的时间与申请的空间大小无关,只与申请次数有关
- 迭代器方式遍历:
for(vector<int>::iterator i = a.begin(); i != a.end(); i ++ ) cout << *i << endl;
- 同时支持下标遍历、范围遍历
- 支持比较运算,从高位向低位按照字典序比较
pair
可以存储一个二元组
- 前后两个变量类型可以任意
- 获取第一、二个元素:p.first, p.second
- 支持比较运算,按照字典序排序,优先按照first比较
- 构造pair:
p = make_pair(x, y)
//或者
p = {x, y};
- 常用情景是“附带卫星数据”、“按照某个主要数据排序”
- pair相当于帮我们实现了比较函数的结构体
string
字符串数组
- 对字符串的封装
- 支持的操作:
- size()
- empty()
- clear()
- '+'
- substr(a, b) a表示子串的起始位置,b表示子串的长度(缺省表示直到结尾)
- c_str()可以返回所存储字符数组的起始地址
queue
队列
- 支持的操作:
- push()
- front()
- back()
- pop()
- size()
- empty()
- 注意没有clear函数、
- 想要清空,直接重新构造 q = queue
()
priority_queue
优先队列
- 需要包含
头文件 - 底层实现是堆
- 支持的操作:
- push()
- pop()
- top()
- empty()
- size()
- 默认声明的是大根堆
- 实现小根堆的方式:
- 插入的时候插入对应数字的负数
- 按照下面的方式来定义
priority_queue<int, vector<int>, greater<int>> heap;
stack
栈
- 支持的操作:
- push()
- top()
- pop()
- empty()
- size()
deque
双端队列
- 相当于加强版本的vector
- 支持的操作:
- size()
- empty()
- clear()
- front() back()
- push_front() push_back()
- pop_front() pop_back()
- 缺点是很慢
set, map, multiset, multimap
- 加multi表示可以有重复元素
- 底层实现是红黑树
- ++ -- 时间复杂度logn
set/multiset
- 支持的操作:
- begin() end()
- insert()
- find()
- count()
- erase()
- 输入是一个数x,删除所有x 时间复杂度O(k + logn)
- 输入是一个迭代器,删除这个迭代器
- lower_bound(x) 返回大于等于x的最小的数的迭代器
- upper_bound(x) 返回大于x的最小的数的迭代器
map/multimap
- 支持的操作:
- begin() end()
- insert() 插入的数是一个pair
- erase() 参数是pair或迭代器
- find()
- lower_bound(), upper_bound()
- 可以像用数组一样用map,时间复杂度是logn
unordered_set, unordered_map, unordered_multiset, unordered_multimap
- 和上面的类似,增删改查的时间复杂度是O(1)
- 不支持lower_bound(), upper_bound()等基于排序的操作
- 不支持迭代器的++ --
bitset
压位
- 定义: bitset<10000> s;
- 支持的操作:
- ~ & | ^
- 移位运算符
- == !=
- []
- count() 返回有多少个1
- any() 判断是否至少有一个1
- none() 判断是否全为0
- set() 把所有位置为1
- set(k, v) 将第k位变成v
- reset() 把所有位变成0
- flip() 等价于~
- flip(k) 第k位取反