STL

STL基础

queue队列

头文件: <queue>
定义: queue<T> q
入队: q.push(x) //O(1)
查看队首元素: q.front() //O(1)
出队: q.pop() //O(1)
获取大小: q.size() //O(1)

stack栈

头文件: <stack>
定义: stack<T> st
插入: st.push(x) //O(1)
查看栈顶元素: st.top() //O(1)
弹出栈顶元素: st.pop() //O(1)
获取大小: st.size() //O(1)

vector向量

头文件: <vector>
定义: vector<T> vec
插入: vec.push_back(x) //O(1)
随机访问: vec[i] //O(1)
获取大小: vec.size() //O(1)

string字符串

头文件: <string>
定义: string s
插入: s.push_back(x) //O(1)
随机访问: s[i] //O(1)
反转: reverse(s.begin(),s.end()) //O(n) 只能原地反转
取字串:
(1)string sub=s.substr(i,len); //取 s[i,i+len-1]赋值给sub
(2)string sub=s.substr(i) //取 s[i...]赋值给sub
查找: s.find(c)
(1)找到了: 返回c在s的下标
(2)没找到: 返回参数std::string::npos
删除:
(1)s.erase(i,len) //删除 s[i,i+len-1]
(2)s.erase(i) //删除 s[i...]
获取大小: s.size() //O(1)

map映射

头文件: <map>
定义: map<T,T> mp
赋值: mp[x]=y //O(logn) 注意如果key=x已存在会覆盖
取值: mp[x] //O(logn)
查找键为x: mp.find(x) //O(logn) 一定不能直接用中括号!
(1)找到了:返回对应迭代器
(2)没找到: 返回mp.end()
键: it->first / it.first
值: it->second / it.second
删除: mp.erase(it) //O(1)
检查非空: mp.empty()

multimap映射

头文件: <map>
定义: multimap<T,T> mp
赋值: mp.insert(make_pair(x,y)) //O(logn) 不能直接用中括号
查找: mp.find(x) //O(logn)
键为x的所有值:
auto lb=lower_bound(mp.begin(),mp.end())
auto ub=upper_bound(mp.begin(),mp.end())
for(auto it=lb;it!=ub;++it) ...
查找键为x: mp.find(x) //O(logn) 一定不能直接用中括号!
(1)找到了:返回对应迭代器
(2)没找到: 返回mp.end()
查找键为x的元素个数: mp.count(x)
删除
(1)按键删除(多删): mp.erase(x) //O(logn) 会删除这个键对应的所有元素
(2)按迭代器删除(单删): mp.erase(mp.find(x)) //O(logn) 删除键x对应的一个元素

unordered_map无序映射

头文件: <unordered_map>
定义: unordered_map<T,T> mp
// 用法同map,但本质上哈希表,不是红黑树
// 题目容易构造特殊数据将操作卡到 O(n) 慎用

set,multiset集合

*不支持随机访问(下标)
头文件:<set>,<multiset>
定义: set<T> st
插入: st.emplace(x)或st.insert(x) //O(logn)
删除: st.erase(x) //O(logn) x:迭代器/值
清空: st.clear() //O(n)
获取大小: st.size() //O(1)
查找: st.find(x) //O(logn)
出现次数: st.count(x) //O(logn)
前一个迭代器: prev(it) //O(1)
后一个迭代器: next(it) //O(1)
前往后遍历:
for(set<T>::iterator it=st.begin();it!=st.end();++it){...} //O(n)
后往前遍历:
for(set<T>::reverse_iterator it=st.rbegin();it!=st.rend();++it){...} //O(n)
查找第一个大于等于x的元素:
set<T>::iterator it= lower_bound(st.begin(),st.end(),x) //O(logn)
查找第一个大于x的元素:
set<T>::iterator it= upper_bound(st.begin(),st.end(),x) //O(logn)
multiset的删除:
删除一个值x的所有元素: st.erase(x); //O(logn)
一个值x仅删除一个元素: st.erase(st.find(x)); //O(logn)

deque双端队列

头文件:<deque>
定义: deque<T> q
队首插入: q.push_front(x) //O(1)
队尾插入: q.push_back(x) //O(1)
队首删除: q.pop_front(x) //O(1)
队尾删除: q.pop_back(x) //O(1)
获取队首元素: q.front() //O(1)
获取队尾元素: q.back() //O(1)

priority_queue堆

头文件:<queue>
定义:
(1)大根堆(默认):priority_queue<T> q
(2)小根堆:priority_queue<T,vector<T>,greater<T>> q //greater后面没有()
插入: q.push(x) //O(logn)
查看最值: q.top() //O(1)
弹出最值: q.pop() //O(logn)
获取大小: q.size() //O(1)

补充: 结构体小根堆

  • 小根堆重载 > 号
struct info{
ll x;
ll y;
bool operator>(const info & o)const {
if(x==o.x){
return y>o.y;
}
return x>o.x;
}
};
priority_queue<info,vector<info>,greater<info> > q;
/*
input:(1,5) (4,3) (2,6) (2,3) (4,5)
output:(1,5) (2,3) (2,6) (4,3) (4,5) 1. x从小到大 2.x相同的话 y从小到大
*/
posted @   Gusare  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示