碎碎念

济南划水第$1$天,$T2$敲了$100$多行的线段树$30$分都没骗到$QAQ$

"标程写的是$map$套$multiset$"(哞踢$set$是啥???)

于是我决定滚回来学习一下$STL$。

Stack

stack<int> st;//定义一个栈
s.push(x);//入栈
s.top();//访问栈顶元素
s.pop();//出栈
s.size()//大小
s.empty()//是否为空

Queue

普通队列
queue<int> q;//定义一个队列
q.push(x);//入队
q.front();//访问队首
q.back();//访问队尾
q.pop();//删除队首
优先队列

优先队列储存的元素必须定义“小于号”运算符。

priority_queue<int> q;//定义一个优先队列(默认先弹出较大元素)
priority_queue <int,vector<int>,greater<int> > q;//先弹出较小元素
q.push(x);//入队
q.top();//访问队首
q.pop();//删除队首
双端队列
deque<int> q;//定义一个双端队列
q.push_back(x);//从队尾入队
q.push_front();//从队首入队
q.front();//访问队首
q.back();//访问队尾
q.pop_back();//弹出队首元素
q.pop_front();//弹出队尾元素

Vector

vector<int> v;//定义一个vector
v.push_back();//尾部扩充元素
vector<int>::iterator it;//
for(it=v.begin();it!=v.end();it++)    cout<<*it;
v.insert(v.begin()+i,6);//在第i个元素后插入6
v.erase(v.begin()+1,v.begin()+5);//删除[1,5)
reverse(v.begin(),v.end());    //翻转数组
sort(v.begin(),v.end(),Comp);//自定义排序
v.size()//大小
v.empty()//是否为空
v.clear();//清空

String

string s;//定义一个字符串
s="Hello,world";//赋值
s=s+"abc";//尾部扩充字符(串)
s.insert(s.begin()+1,'p');//在第i个元素后插入字符p
s.erase(s.begin()+1,s.begin()+5);//删除[1,5)
s.length()//长度
s.empty()//是否为空
s.replace(3,3,"good")//从第三个开始,将连续的3个字符换成good
s.find('c')//返回第一个c的下标,没有返回4294967295或-1
s.compare(ss)//s比ss大返回1,相等0,小-1
reverse(s.begin(),s.end()); //翻转字符串
s.clear();//清空

Set

$set$和$multiset$储存的元素必须定义“小于号”运算符。

set<int> s;//定义一个集合
multiset<string> ms;//定义一个多重集合
s.insert(x);//插入元素
set<int>::iterator it;//迭代器访问
for(it=s.begin();it!=end();it++) cout<<*it;
s.erase(it)//删除迭代器it指向的元素
s.erase(6);//删除所有为6的元素
//多重集中一个一个删使用迭代器
s.clear();//清空
s.find(6);//查找6这个元素,返回迭代器位置
//没有返回s.end()
s.lower_bound(x)//查找大于等于x的元素中最小的,返回指向该元素的迭代器
s.upper_bound(x)//查找大于x的元素中最小的,返回指向该元素的迭代器
s.count(x)//返回集合中x的元素个数

Map

$map$储存的元素必须定义“小于号”运算符。

注意

①在$map$中,由$key$查找$value$时,首先要判断$map$中是否包含$key$。

②如果不检查,直接返回$map[key]$,如果map不包含$key$,会在$map$中插入一个$key$的元素。

③$map$提供了两种方式查看是否包含$key$:

​ Ⅰ$m.count(key)$:由于$map$不包含重复的$key$,因此$m.count(key)$取值为$0$或$1$,表示是否包含。

​ Ⅱ$m.find(key)$:返回迭代器,判断是否存在。

map<string,int> m;//string的是键值,int的是映照值
m["Jack"]=98;//插入
map<string,int>::iterator it;
for(it=m.begin();it!=m.end();it++)//迭代器访问
    cout<<(*it).first<<(*it).second<<endl;

Bitset

bitset<100000> s;//定义一个10000位的二进制数
s[k]//表示s的第k位,既可以取值们也可以赋值
//在1000位的二进制数中,最低位为s[0],最高位为s[999]
s.count()//返回有多少个1
s.any()//有1返回true
s.none()//全是0返回true
s.set();//把s所有位变为1 
s.set(k,v);//把s第k位变成v 
s.reset();//把s所有为变为0 
s.reset(k);//把s第k位变为0 
s.flip();//把s所有位取反 
S.flip(k);//把s第k位取反 

撒花★,°:.☆( ̄▽ ̄)/$:.°★

参考/转载自:
https://blog.csdn.net/qq_41657977/article/details/89161432

https://blog.csdn.net/liaosongmao1/article/details/42028657