C++ STL
常用的 STL 头文件如下
vector
简单来说vector是一个动态数组,数组长度可变。
和数组一样支持随机访问 []
,对比数组增加了一些函数:
- size/empty
size函数会返回vector的元素个数,empty会返回一个bool类型,表示vector是否为空
*所有的STL容器都支持这两个方法,含义也相同,后面不再重复给出
- clear
清空vector数组
- begin/end
begin 返回指vector中第一个元素的迭代器(类似指针)
end 返回vector中最后一个元素的迭代器
- front/back
front 返回vector中第一个元素
back 返回vector中最后一个元素
- push_back/pop_back
push_back 把元素插入到最后
pop_back 把最后一个元素删除
queue
这个头文件下包含 循环队列 queue 和 优先队列 priority_queue
queue 的函数:
方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
push | 入队 | q .push(x) | O(1) |
pop | 出队 | q.pop() | O(1) |
front | 队头元素 | x = q.front() | O(1) |
back | 队尾元素 | x= q.back() | O(1) |
priority_queue的函数:
方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
push | 入队 | q .push(x) | O(log n) |
pop | 出队 | q.pop() | O(log n) |
top | 查询最大值 | x = q.top() | O(1) |
deuqe
deque 是双端队列,支持从队头和队尾插入删除元素,支持像数组一样随机访问
方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
[] | 随机访问 | 类比vector | O(1) |
begin/end | deque的头/尾迭代器 | 类比vecotr | O(1) |
front/back | 返回队头/队尾元素 | 与queue类似 | O(1) |
push_back | 从队尾入队 | q.push_back(x) | O(1) |
push_front | 从队尾出队 | q.pop_back() | O(1) |
pop_back | 从队头入队 | q.push_front(x) | O(1) |
pop_front | 从队头出队 | q.pop_front() | O(1) |
clear | 清空队列 | q.clear() | O(n) |
set
set头文件里包含set和multiset,分别是 有序集合 和 多重有序集合,底层实现是红黑树
set和multiset函数基本相同
- set/empty/clear
与vector类似
- begin/end
分别返回set的头/尾迭代器
- insert
插入一个元素x
- find
查找一个元素,返回元素的迭代器,若不存在返回end()
- low_bound/upper_bound
low_bound(x) 返回 >= x的元素中最小的一个的迭代器
upper_bound 返回 > x 的元素中最小的一个迭代器
- erase
erase(it) 删除it迭代器指向的元素
- count
count(x) 返回集合中等于x的元素个数
map
Map 是一个键值对的映射,key必须定义小于号运算符
- size/empty/clear/begin/end
与set类似
- insert/erase
与set类似
- find
find(x) 查找map中key为x的二元组,并返回指向该二元组的迭代器,若不存在,返回end()
- [] 操作符
内容多,不详细展开
bitset
bitset可以看作一个多位的二进制数,每8位占用一个字节,相当于是状态压缩的二进制数组,支持位运算。一般以32为基准,因此n位的bitset执行一次位运算的复杂度可以视为n/32,效率较高
-
位运算操作符
~:按位取反
&, |, ^ :分别是按位与、或、非运算
<<, >> :把一个bitset左移、右移若干位
!= ,== : 比较两个bitset的二进制数是否想同 -
[]
操作符
s[k]表示s的第k位,可以取值,也可以赋值 -
count
返回有多少位为1 -
any/none
若s位所有位都为0,则s.any()返回false,s.none()返回true
若s位所有位都为1,则s.any()返回true,s.none()返回false -
set/reset/flip
s.set() 把s所有位变为1
s.set(k, v) 把第k位改为v
s.reset() 把所有位变为0
s.reset(k) 把第k位变为0
s.flip() 把所有位取反
s.flip(k) 把第k位取反
algorithm
这个是一个头文件,里面有一些常用的函数
- reverse 翻转
- unique 去重
- random_shuffle 随机打乱
- next_permutation 下一个排列
- sort 排序
- upper__bound/lower_bound 二分