vector
变长数组,倍增的思想
vector<int> a()
默认构造
vector<int> a(10)
构造有10个元素的vector容器,默认值为0
vector<int> a(10, -3)
构造有10个元素的vector容器,赋值为-3
size()
返回容器内元素的个数
empty()
返回容器是否为空
这两个方法是所有容器都有的,时间复杂度是O(1)
auto遍历元素也是所有容器都有的
系统为某一程序分配空间时,所需时间与空间大小无关,与申请次数有关
clear()
清空容器
front()
返回vector的第一个元素
back()
返回vector的最后一个元素
push_back()
向vector最后插入一个元素
pop_back()
向vector最后取出一个元素
begin()
迭代器是vector的第0个数
end()
迭代器是vector的最后一个数的后一位
vector和数组一样支持随机寻址
vector 容器支持比较运算,按字典序
pair
pair可以看成有两个元素的结构体,并实现了比较函数
pair<int, string> p
p.first
第一个元素
p.second
第二个元素
pair支持比较运算,按字典序,以first为第一关键字,以second为第二关键字
p = make_pair(10, "wzh")
构造pair
或者p = {10, "wzh"}
C11支持
也可以用pair存储三个数据类型:
pair<int, pair<int, int>>
string
字符串
size()/length()
返回字符串长度
empty()
clear()
string
支持+运算符
(1, 2)
取字串
第一个参数表示开始截取字符串的位置(从0算起)
第二个参数表示截取字串的长度。若长度大于剩余长度或省略参数,则会截取到最后
c_str()
返回存储字符数组的起始地址
printf("%s\n", a.c_str);
(printf无法直接输出字符串)
queue
队列
queue<int> q
没有clear函数,如果想清空的话,可以重新构造:
q = queue<int>()
push()
向队尾插入一个元素
front()
返回队头元素
back()
返回队尾元素
pop()
弹出队头元素
priority_queue
优先队列(堆),默认是大根堆
头文件引入的是<queue>
priority_queue<int> heap
构造小根堆的方法:
直接插入负数
定义时定义成小根堆:priority_queue<int, vector<int>, greater<int>>
push()
插入一个元素
top()
返回堆顶元素
pop()
弹出堆顶元素
stack
栈
size()
empty()
push()
向栈顶插入一个元素
top()
返回栈顶元素
pop()
弹出栈顶元素
deque
双端队列,支持双端插入删除,支持随机访问
size()
empty()
clear()
front()
back()
push_back()/pop_back()
begin()/end()
支持迭代器
set, multiset
基于平衡二叉树(红黑树),动态维护有序序列
size()
empty()
clear()
begin()/end()
++,-- 返回前驱和后继,时间复杂度logn
头文件<set>
构造:set<int> S multiset<int> MS
区别:set会忽略重复元素,multiset可以有重复元素
insert()
插入一个数
find()
查找一个数
count()
返回某一个数的个数
erase()
输入是一个数x,删除所有的x,时间复杂度:O(k + logn)k为x的个数
输入一个迭代器,删除这个迭代器
lower_bound(x)
返回大于等于x的最小的数的迭代器
upper_bound(x)
返回大于x的最小的数的迭代器
map, multimap
头文件
insert()
插入的数是一个pair
erase()
输入的参数是pair或迭代器
find()
[ ] 可以像数组一样使用map,但是时间复杂度是logn
lower_bound()/upper_bound()
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()
等价于~
filp(k)
把第k位取反