$C++ STL$总结

Posted thwzf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了$C++ STL$总结相关的知识,希望对你有一定的参考价值。

目录

$vector$

$queue$

$priority\_queue$

$deque$

$set,multiset$

$map,multimap$

$bitset$

常用函数$algorithm$


 

♦$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$的最后一个元素

$go back$


 

♦$queue<int> q$

循环队列$queue$

$push/pop$

$q.push(x)$表示将元素$x$从队尾插入队列中

$q.pop()$表示将队头的第一个元素弹出

$front/back$

$q.front()$返回队头第一个元素

$q.back()$返回队尾第一个元素

$go back$


 

♦$priority\_queue<int> q$

优先队列$priority\_queue$,相当于一个大根堆

$push/pop/top$

$q.push(x)$表示插入元素$x$

$q.pop()$表示弹出堆顶元素

$q.top()$表示返回堆顶元素

重载“$<$”运算符

$go back$


 

♦$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()$即清空队列

$go back$


 

♦$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$中是否存在

$go back$


♦$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$查找,然后用$[]$操作赋值

$go back$


♦$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$

$go back$


 

♦常用函数$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))$

$go back$

以上是关于$C++ STL$总结的主要内容,如果未能解决你的问题,请参考以下文章

STL总结

C++STL容器归纳总结顺序容器

C++中STL用法超详细总结(收藏级)

❤ 挑战C站最强C++ STL标准库总结(内含大量示例)

STL学习总结

STL 总结