vector变长数组 基本思想:倍增的思想
size() 返回元素个数
empty() 返回是否为空
clear() 清空
front()/ back()
push_back()/pop_back()
begin()/end()
[]
支持比较运算,按字典序
注:系统为某一程序分配空间时,所需时间与空间大小无关,与申请次数有关,
因此vector需要尽量减少申请次数,可以适当浪费空间
vector在比较过程中使用的是字典序进行比较,
字典序比较是从第一个数开始比较,如果第一个数小于,则小于,只有在当前位置数相等才看下一位
pair<int,int>
first,第一个元素
second,第二个元素
支持比较运算,以first作为第一关键字,以second作为第二关键字(字典序)
如果想进行初始化的话可以使用make_pair();
pair是可以支持嵌套的,如pair<int,pair<int,string>> p 那么pair可以存储三种属性
pair可以看做帮我们已经实现了一个具有两个成员变量的结构体 可以节省一写代码
string字符串
substr(参数起始位置,数组长度):返回某一个子串
c_str() 放回str对应数组的一个头指针
size()/length() 返回字符串长度
empty()
clear()
queue 队列
empty()
size()
push(),向队尾插入一个元素
pop(),弹出队头元素
front(),返回队头元素
back(),返回队尾元素
因为没有clear 因此如果想构造一个起始队列,则重新构建一个队列即可 如 q = queue<int>();
priority_queue 优先队列(堆) 默认是大根堆
push(),在堆中插入一个元素
top(),返回堆顶元素
pop(),弹出堆顶元素
如果说想定义一个小根堆,第一种方法则在插入过程中输入一个负数即可
第二种方法则是 priority_queue<int,vector<int>,greater<int>> heap;
stack 栈
empty()
size()
push() 向栈顶插入一个元素
top() 返回栈顶元素
pop() 弹出栈顶元素
deque 双端队列
empty()
size()
clear()
front()
back()
push_back()/pop_back()
push_front()/pop_front()
set,map,multiset,multimap 基于平衡二叉树(红黑树),动态维护有序序列
set/multiset
insert() 插入一个数
find() 查找一个数
count() 返回某一个数的个数
begin()/end() ++,-- 返回前驱和后继 时间复杂度为O(logn)
erase()
(1) 输入是一个数x,删除所有x O(k + logn)
(2) 输入一个迭代器,删除这个迭代器
lower_bound()/upper_bound()
lower_bound() 返回大于等于x的最小的数的迭代器
upper_bound() 返回大于x的最小的数的迭代器
map/multimap
insert() 插入的是是一个pair
erase() 输入的参数是pair或者迭代器
find()
[] 像用数组一样来使用map/multimap 时间复杂度为O(logn)
lower_bound()/upper_bound()
注:set里面是不允许存入重复的元素的,如果存入的话会被自动忽略掉
unordered_set,unordered_map,unordered_multiset,unordered_multimap,哈希表
和上面类似,增删改查的时间复杂度为O(1)
不支持 lower_bound()/upper_bound(),迭代器的++,-- 所有关于排序的操作都是不支持的
bitset 压位
bitset<10000> 5;
~,&,^,|
>> <<
== !=
[]
count() 返回多少个1
any() 判断是否至少有一个1
none() 判断是否全为0
set() 把所有位置全为1
set(k,v) 将第k位变为v
reset() 把所有位变成0
flip() 等价于~
flip(k) 把第k位取反
作用:之前每个状态需要1个字节,1024个状态记录需要1024个字节,
但现在通过bitset每个状态只需要1位,1024个状态只需要128个字节