$C++\ STL$总结
目录
♦$vector<int>\ a$
$size/empty$
$a.size()$返回$a$的元素个数
$a.empty()$返回$bool$类型,即$a$是否为空
$clear$
$a.clear()$表示把$a$清空
迭代器
类似指针,可以与整数相加减,可以两个迭代器之间相加减
$vector<int>::iterator\ it$
$begin/end$
$a.begin()$返回第一个元素的迭代器,若$a$非空,则$*a.begin()$与$a[0]$作用相同
$a.end()$返回最后一个元素后面的位置的迭代器,即$*a.end()$和$a[a.size()]$都是越界访问
$front/back$
$a.front()$返回第一个元素,相当于$*a.begin()$和$a[0]$
$a.back()$返回最后一个元素,相当于$*(--a.end())$和$a[a.size()-1]$
$push\_back/pop\_back$
$a.push\_back(x)$表示把元素$x$插入到$a$的尾部
$a.pop\_back()$表示删除$a$的最后一个元素
♦$queue<int>\ q$
循环队列$queue$
$push/pop$
$q.push(x)$表示将元素$x$从队尾插入队列中
$q.pop()$表示将队头的第一个元素弹出
$front/back$
$q.front()$返回队头第一个元素
$q.back()$返回队尾第一个元素
♦$priority\_queue<int>\ q$
优先队列$priority\_queue$,相当于一个大根堆
$push/pop/top$
$q.push(x)$表示插入元素$x$
$q.pop()$表示弹出堆顶元素
$q.top()$表示返回堆顶元素
重载“$<$”运算符
♦$deque<int>\ q$
双端队列支持在两端快速插入或删除元素且支持随机访问
$[]$
支持随机访问,$q[x]$表示$q$中的第$x+1$个元素
$begin/end$
类似$vector$
$front/back$
类似$queue$
$push\_front/push\_back$
$q.push\_front(x)$表示将$x$从队头入队
$q.push\_back(x)$表示将$y$从队尾入队
$pop\_front/pop\_back$
$q.pop\_front()$表示弹出队头元素
$q.pop\_back()$表示弹出队尾元素
$clear$
$q.clear()$即清空队列
♦$set<int>\ s,multiset<int>\ s$
$set$是有序集合,$multiset$是有序多重集合,和单调队列一样是定义“$<$”运算符
$size/empty/clear$
类似$vector$
迭代器
$set,multiset$不支持随机访问,迭代器仅支持$++,--$两种运算
$set<int>::iterator\ it$
$multiset<int>::iterator\ it$
$begin/end$
类似$vector$
$insert$
$s.insert(x)$表示插入元素$x$
若$set$中已经存在$x$,则忽略该次操作
$find$
$s.find(x)$表示寻找等于$x$的元素,返回指向该元素的迭代器
若不存在返回$s.end()$
$multiset$中有重复元素可能是返回第一个的迭代器,但未经尝试,建议使用$lower\_bound$
$lower\_bound/upper\_bound$
$s.lower\_bound(x)$返回$\ge x$中最小的一个元素的迭代器,如果$multiset$中有重复则返回第一个
$s.upper\_bound(x)$返回$>x$中最小的一个元素的迭代器
这两个函数和$find$一样如果找不到就返回$s.end()$
$erase$
$it$为迭代器,则$s.erase(it)$表示删除元素$*it$
$x$为元素,则$s.erase(x)$表示删除所有等于$x$的元素
如果要删除的元素不存在,则忽略这个操作
$count$
$s.count(x)$返回集合中元素$x$的个数,在$set$中返回值只可能是$0$或$1$,则可以用于判断元素$x$在$set$中是否存在
♦$map,multimap$
$map$容器是一个键值对$(key-value)$映射,$key$需要定义“$<$”符号
定义举例如下
$map<long\ long,bool>\ vis$
$map<string,int>\ hash$
$map<\ pair<int,int>,vector<int>\ >\ test$
$size/empty/clear/begin/end$
类似$set$
迭代器
$map$的迭代器与$set$类似,但是解除引用后得到的是一个二元组
$insert/erase$
类似$set$,$insert$的参数是$pair$,$erase$的参数可以是迭代器也可以是$pair$
$find$
$s.find(x)$表示在变量名为$s$的$map$中查找$key$为$x$的二元组,返回指向该二元组的迭代器
$[]$
$s[key]$返回$key$映射到的$value$
如果查找的$key$不存在,则执行$s[key]$后,$s$会自动新建一个二元组$(key,zero)$,建议在使用$[]$前先使用$find$查找,然后用$[]$操作赋值
♦$bitset$
定义
$bitset<n>\ s$表示一个$n$为二进制数
位运算
$~s$:对$s$按位取反
$\$,|,$^:返回对两个位数相同的$bitset$按位运算的结果
$<<,>>$:返回把一个$bitset$左移、右移后的结果
$==,!=$:比较两个$bitset$代表的二进制数是否相等
$[]$
$s[k]$表示$s$从右往左数第$k-1$位,可以取值也可以赋值
$count$
$s.count()$返回$s$有多少位$1$
$any/none$
$s.any()$返回$s$中是否至少有一位为$1$,$s.none()$返回$s$中是否全为$0$
$set/reset/flip$
$s.set()$把$s$所有位变为$1$,$s.set(k,v)$表示把$s$的第$k$位改为$v$,即$s[k]=v$
$s.reset()$把$s$所有位变为$0$,$s.reset(k)$表示把$s$的第$k$位改为$0$,即$s[k]=0$
$s.flip()$把$s$的所有位取反,即$s=~s$,$s.flip(k)$把$s$的第$k$位取反,即$s[k]$^$=1$
♦常用函数$algorithm$
常用的几个对序列操作的函数,对下标处于$[l,r)$中的元素执行操作
$reverse$翻转
翻转$vector<int>\ a$:$reverse(a.begin(),a.end())$
翻转数组$int\ a[n]$:$reverse(a+1,a+1+n)$
$unique$去重
返回去重后的尾迭代器,依然为前闭后开区间,$m$记录去重后的元素个数。
把$vector<int>\ a$去重:$m=unique(a.begin(),a,end())-a.begin()$
把数组$int\ a[n]$去重:$m=unique(a+1,a+1+n)-(a+1)$
$random\_shuffle$随机打乱
用法同$reverse$
$lower\_bound/upper\_bound$二分
$lower\_bound$返回第一个$\ge x$的元素的位置的迭代器,$upper\_bound$返回第一个$>x$的元素的位置的迭代器
前提保证查找的区间$[l,r)$是有序的
在数组$int\ a[n]$中查找$\ge x$的最小整数的下标$i=lower\_bound(a+1,a+1+n,x)-a$
在$vector<int>\ a$中查找$\le x$的最大整数$y=*(--upper\_bound(a.begin(),a.end(),x))$