STL用法总结
bitset
超级好用的东西.由于内存地址是按字节即 byte 寻址,而非比特
bitset 就是通过固定的优化,使得一个字节的八个比特能分别储存
对于一个
函数:
bitset<N> jg;//开一个大小为N的bitset
bitset.set()//全设为1
bitset.reset()//全设为0
jg[pos]//访问第pos位的值(从0开始)
| & >> << //左移右移一定要自己模拟一下
jg._Find_next(pos)//找在pos位后面的第一个1,(不包括pos本身)
jg._Find_first()//找第一个1(从低到高)
jg.none()//是否全是0
jg.all()//是否全是1
jg.any()//是否有1
jg.count()//一的个数
jg.test(pos)//检测pos位是否为1
jg.flip()//反转所有位
jg.flip(pos)//反转pos位
jg.to_ullong()//返回转换为unsigned long long 的结果
应用:
1.bitset配合埃式筛比
bitset<N> vis;
void ycl()
{
vis[1]=0;
for(int i=2;i*i<=n;i++)//后面一定没用
if(!vis[i])
for(int j=i*i;j<=n;j+=i)//2*i一定被前面标记了。
vis[j]=1;
for(int i=2;i<=n;i++)if(!vis[i])prim[++cnt]=i;
}
2.bitset配合莫队
因为莫队的一次修改是O(1)的与bitset很切合,所以可以在用莫队的同时用bitset,实现一些别的东西。
如这道题
3.储存是否存在的DP(如0/1背包)
一个数有没有出现过。(树上)
for(int i=0;i<len;i++)
{
int v=ve[u][i];
if(v==fa)continue;
ff=jg<<siz[v];
jg|=ff;
}
set/multiset
这两个的区别在于一个可以重复,一个不可以重复。
突出的特点是可以制动排序,维护的是一个有序数列。底层实现是红黑树。
函数(基本相同)
set<N> jg;//开一个大小为N的bitset
jg.insert(x)//插入一个数值
jg.erase(x)//删除数值\位置,如果是可重集数值会删除所有
jg.erase(l,r)//删除区间
jg.find(x)//x出现的位置,不存在返回end;
jg.count(x)//x的个数
jg.upper_bound(x)//lower_bound同理,二分查找自带的更快
jg.begin()//开头的迭代器
jg.end()//结尾的迭代器
jg.size()//总个数
jg.swap(jg1)//交换两个set
jg.clear()//清空
jg.empty()//是否为空
应用
在某些题里平替掉平衡树。
如这个题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具