STL用法总结

bitset

超级好用的东西.由于内存地址是按字节即 byte 寻址,而非比特bit ,一个 bool 类型的变量,虽然只能表示 0/1 , 但是也占了 1byte 的内存。
bitset 就是通过固定的优化,使得一个字节的八个比特能分别储存 8 位的 0/1
对于一个4字节的 int 变量,在只存 0/1 的意义下,bitset 占用空间只是其 132,计算一些信息时,所需时间也是其 132

函数:

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配合埃式筛比 O(n) 更快。

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()//是否为空

应用

在某些题里平替掉平衡树。
这个题

posted @   storms11  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示