STL用法总结
统一
- \(swap\) 任意东西都是 \(O(1)\) (数字可以交换指针)
bitset
超级好用的东西.由于内存地址是按字节即 byte 寻址,而非比特\(bit\) ,一个 \(bool\) 类型的变量,虽然只能表示 \(0/1\) , 但是也占了 \(1byte\) 的内存。
bitset 就是通过固定的优化,使得一个字节的八个比特能分别储存 \(8\) 位的 \(0/1\)。
对于一个\(4\)字节的 int 变量,在只存 0/1 的意义下,bitset 占用空间只是其 \(\frac{1}{32}\),计算一些信息时,所需时间也是其 \(\frac {1}{32}\)。
函数:
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()//是否为空
应用
在某些题里平替掉平衡树。
如这个题
rope
打 \(ABC\) 时不会正解用 \(string\) 写暴力挂完了,赛后大家说用 rope 可以直接暴力冲过去,所以我要加入 rope 这个更权威的圈子。
据说底层实现时块状链表,所以大部分操作是 \(O(\sqrt n)\) 的。存字符串可以完全爆掉 \(string\) ,还可以当做可持久化平衡树来用。
函数
#include<ext/rope>//头文件
using namespace __gnu_cxx;//命名空间
rope<int>rp;
rope<char>rp 等价于 crope rp 等价于 string rp
rp.push_back(x); // 在末尾添加字符x
rp.insert(pos, x); //在第pos个字符后面插入x
rp.erase(pos, x); // 在第pos的字符后面删除x个字符
rp.length(); // 返回 rp 的大小
rp.size(); // 同上
rp.replace(pos,s); // 从第pos个元素开始替换成s
rp.substr(pos, x); // 从第pos个元素开始提取x个字符
rp[x]; // 访问第 x 个元素
rp.at(x); // 同上
rp.append(s,p,n)//把字符串s中从第p个字符串开始的 n 个字符连接到 a 的结尾

浙公网安备 33010602011771号