1、vector
变长数组
- 有
clear
清空操作。 - 支持比运算,两个
vector
按字典序比较大小
2、string
substr
string substr (size_t pos = 0, size_t len = npos) const;
返回一个string
中下标pos
开始,长度为len
的子字符串,若len
超过最大长度则直接返回从pos
到末尾。
c_str
c_str()返回一个string中首元素的下标。用于用scanf
输出一个string
:
scanf("%s", a.c_str());
3、queue
push()
向队尾插入一个元素
empty()
判空
size()
返回队列大小
front()
返回队头元素
back()
返回队尾元素
pop()
弹出队头元素
4、pair
支持比较运算,以first
为第一关键字,以second
为第二关键字,进行字典序比较
5、priority_queue
优先队列(实现原理是堆,默认是大根堆)
需要include<queue>
头文件才能使用。
- 没有
clear
。 push
插入一个元素top
返回堆顶元素pop
弹出堆顶元素
如何定义小根堆?
- 法一:插入元素时,插入
-x
。这可太妙了! - 法二:
priority_queue<int, vector<int>, greater<int>> heap;
6、stack
栈
size
empty
push
栈顶插入top
返回栈顶pop
弹出栈顶
7、deque
双端队列(用的很少,效率太低了)
size
empty
clear
front
/back
push_back
/pop_back
push_front
/pop_front
begin
/end
[]
8、set
,map
,multiset
,multimap
(基于平衡二叉树(红黑树),动态维护有序序列)
他们都支持:
size
empty
clear
begin
/ and
及其++
--
(时间复杂度也为O(logn) )
set
/ multiset
(下面所有操作时间复杂度为logn
)
insert
插入一个数
find
查找一个数
count
返回某一个数的个数
erase
:
- ——输入是一个具体数
x
,参数所有x
时间复杂度:O(k + logn) ,k是x
的个数,n
是元素个数 - ——输入一个迭代器,删除这个迭代器
set
的核心操作:
lower_bound
:返回>=
x的最小的数的迭代器
upper_bound
: 返回>
x的最小的数的迭代器
map
/ multimap
()
insert
插入一个pair
(用的不多)
erase
输入参数是pair
或迭代器(常用)
find
[]
(时间复杂度是O(logn) )
9、unordered_set
unordered_map
unordered_multiset
unordered_multimap
(哈希表实现)
和上面的操作类似,增删改查的时间复杂度是O(1)
不支持迭代器的++
--
(也就是:凡是和排序有关的操作都不支持)
不支持 lower_bound
和 upper_bound
10、bitset
压位
bitset<10000> s;
支持:
~
&
|
^
>>
<<
==
!=
[]
count()
返回有多少个1any()
判断是否至少有一个1none()
判断是否全为0set()
把所有位置为1set(k, v)
把第k
位变成v
reset()
把所有位变成0flip()
等价于~
flip(k)
第k
位取反