所有STL容器都要考虑卡常问题,若卡常或有其它需求都要手搓模拟,其它
情况下使用STL会更快,直观,减少错误
容器:
vector 动态数组、可变长度的数组
vector<类型> arr(长度,初值)
二维 vector<vector<int>> arr(a,vector<int>(b,-1))
常用操作:
尾接: arr.push_back(元素)
尾删: arr.pop_back()
获取长度: arr.size() for(int i=1;i<=vec.size();i++)
清空: arr.clear()
判空: arr.empty()
★改变长度;arr.resize(新长度,默认值)
[]运算符
适用情形(特点):
1.当N很大且为二维时,可以在主函数内动态地分配存储空间,不用在全局
声明,减少内存浪费,避免MLE
2.vector的数据存在堆空间中,不会爆栈
注意事项:
1.若能提前确定长度要在全局变量或中提前声明,否则额外内存消耗完的
重分配会花费时间(能提前确定一维确定一维)
2.vector获取长度的方法.size()的返回类型是size_t,相乘会溢出,
需要提前取
容器
stack 栈
stack<类型>stk
常用操作:
入栈: stk.push(元素)
出栈: stk.pop()
取栈顶: stk.top()
★不能查看栈的大小
适用情形(特点):
1.不卡常可用,卡常可以用vector模拟栈,.back()取尾,.push_back()
入栈,.pop_back()出栈
注意事项:
1.栈不能访问内部元素,模拟栈可以
容器
queue 队列
queue<类型> q
常用操作:
入队: q.push(元素)
出队: q.pop()
取队首: q.front();
取队尾: q.back();
适用情形(特点):
1.不卡常可用,卡常可以用vector模拟队列
注意事项:
1.队列不能访问内部元素,模拟队列可以
容器
priority_queue 优先队列 (二叉堆)
priority_queue<类型,容器(默认vector),比较器(可自定义,默认为大根堆)>
priority_queue<int,vector<int>,greater<int>> pq;小根堆
常用操作:
进堆 pq.push(元素)
出堆 pq.pop()
取堆顶 pq.top()
进出队复杂度O(logn),取堆顶O(1)
适用情形(特点):
1.持续维护元素的有序性:每次向队列插入大小不定的元素,或每次从
队列取出大小最小或最大的元素,元素数量是n,插入操作数量为k
★取代插入后再快排的操作
注意事项:
1.不能用下标[]访问
2.所有元素都不可修改,但若修改堆顶则可以
int t = pq.top(),pq.pop(),pq.push(t+x)
★模拟堆可以实现上述操作,但实现较为麻烦和困难
容器
set 集合 元素唯一的序列
set<类型> ste
stt <类型,比较器(默认less)>
for(auto &ele : ste) cout<<ele<<'\n
常用操作:
插入元素:ste.insert(元素)
删除元素:ste.erase(元素)
查找元素:ste.find(元素) auto it = ste.find(元素)
判断元素是否存在: ste.count(元素)
适用情形(特点):
1.元素去重
2.维护顺序
3.当特殊标记数组
元素大小 [-1e18,1e18] 元素数量 1e6,标记数组无法开这么大,但
set可以解决
st[1e19] X
set<int> ste ste.insert(a),ste.insert(b)...
查询是否出现: if(ste.count(x)) cout<<"Yes"<<'\n';
else cout<<"No"<<'\n;
注意事项:
1.不存在下标索引
2.下标不可计算
3.元素只读,不可直接修改,要修改则需先erase再insert
容器
map 映射
map<键类型,值类型,比较器(键大小,默认less)> mp
for(auto &t : mp) cout<<mp.first<<' '<<mp.second<<'\n';
for(auto &[k,v]) cout<<k<<' '<<v<<'\n';
常见操作:
1.可以使用[],mp[1] = 2
2. auto it = mp.fine(元素)
3. mp.erase(元素)
4. mp.count(元素)
适用情形(特点):
维护映射场景,例如统计某个数据出现的次数,mp<int,int> cnt[N]可
代替,但涉及字符串,结构体等需要map
注意事项:
1.访问一个键若对应值不存在则会新增整个键为默认值
2.不能相减得到下标
容器
string 字符串
常见操作:
1. 修改、查询 s[i]
2. 是否相同 if(s1==s2)...
3. 字符串连接 s = s1 + s2 s1 += s2
4. 取字串 str.substr(下标,长度)
5. 查找字符串 int pos = s.find("awa") //第一次出现该子串的下标
6. 与数字相互转化 stoi/stoll/stof/stod/stold to_string()
适用情形(特点):
1.完美平替字符串数组
注意事项:
1.尾接 +=
2.find()的复杂度为O(n^2)即暴力,长度较长不推荐用,还是用KMP
3.不能定义在全局变量,会出现问题
容器
pair
typedef pair<类型,类型> Pxx
算法:
1.swap() 交换
2.sort(.beigin(),.end(),greater<int>()) 快速排序
3.lower_bound()/upper_bound() >=x第一个 >x第一个
4.reverse() 反转
5.max()/min() 取最大/最小
6.unique() 去重但数组长度不变
sort() arr.erase(unique(arr.begin(),arr.end()),arr.end())
7.数学
abs/fbs 取绝对值
exp() e^x
log() lnx
pow() a^b
sqrt() x^1/2
a/b下取整 a/b
a/b上取整 (a+b-1)/b
x^1/2 二分查找 浮点数查找(float/double) 精度不够别用sqrt
a^b 快速幂 别用pow
8.gcd()/lcm() 最大公因数/最小公倍数