C++ STL bitset 容器
C++ STL bitset 容器
前置芝士
- 知道什么是 bool 类型;
- 对二进制有一定的了解。
目录
- Part 1:什么是 bitset
- Part 2:bitset 的用法与函数
- Part 3:bitset 的使用实例
- Part 4:总结
Part 1:什么是 bitset
C++语言的一个类库,用来方便地管理一系列的bit位而不用程序员自己来写代码。(百度百科)
对于我来说,bitset 是一个二进制数,或者可以把它看成一个 bool 类型的一维数组。
Part 2:bitset 的用法
1. 声明
我们可以这样定义 bitset:
...;//忽略
bitset<114514> b;
上面的代码中,我们定义了一个有 114514 位的 bitsetb,我们也可以看成它是一个大小为 114514 的 bool 数组。
2. 调用方法
和数组一样,我们也可以用 [] 来获得 bitset 中某一位的值。比如 b[k] 表示 bitsetb 中的第 k 位。同样,我们可以通过 [] 来修改 bitset 中的值。
在上面定义的 bitset 的大小为 114514,其中我们可以访问 b 的第 0∼114513 位。它的位数是从右往左递增的,即它的二进制表示中最右边是第 0 位,最左边的是第 114513 位。
3. 函数与操作符
count()
b.count() 会返回 b 中有多少个位为 1。
set()/reset()/flip()
- b.flip():把 b 的所有位取反;
- b.flip(pos):把 b 的第 pos 位取反,相当于
s[pos]^=1; - b.set():会把 b 中所有的位变为 1;
- b.set(pos,val):能把 b 的第 pos 位变为 val,相当于
b[pos]=val; - b.reset():和 set() 相反,会把 b 中所有的位变为 0;
- b.reset(pos):把 b 的第 pos 位变为 0,相当于
b[pos]=0。
any()/none()
- 如果 b 中所有位都是 0,那么 b.any() 为 false,b.none() 为 true;
- 如果 b 中至少有一位是 1,那么 b.any() 为 true,b.none() 为 false。
位运算操作符
~b:返回 bitsetb 按位取反的结果;&:返回将两个 bitset 按位与的结果;|:返回将两个 bitset 按位或的结果;^:返回将两个 bitset 按位异或的结果;>>,<<:分别返回把一个 bitset 右移和左移若干位的结果;==,!=:分别返回两个 bitset 是否相等和是否不相等。
*4. 相比于 bool 数组,bitset 的优点
普通的一个 bool 类型的变量需要 1 个字节来存储,但是 bitset 中,每 8 位仅占用一个字节!就比如说刚刚定义的 bitsetb,它的大小为 114514,因为 114514÷8=14314.25,所以这个 bitset 仅需要 14314.25 字节就可以存储了!我们看一个实例:
xxxxxxxxxx
...;
bitset<100005> vis;
bool vis[100005];
这两个东西几乎是一样的,但是 bitset 不仅所耗的内存小,而且可直接使用的函数多,所以它明显是比 bool 数组优的。
Part 3:bitset 的使用实例
1. 存储多个二进制数
比如说,我们要存储 100 个二进制数,每个二进制的长度为 1000。那么我们可以这样定义一个 bitsetv:
xxxxxxxxxx
bitset<100010> v;//设它的大小为100×1000
实际上,我把这 100 个二进制数从二维压成了一维。然后为了更好地访问第 i 个二进制数的第 j 位,我们可以写出以下函数:
xxxxxxxxxx
bool b(int i,int j){
return v[(i-1)*1000+j];//相当于跳过了前面i-1个二进制数,然后再加j位
}
然后我们就可以把这一技巧用于 dfs 迷宫中。
2. 迅速判断 bool 数组中是否有为 true 的值
可以直接用 any() 或 none() 函数实现。
Part 4:总结
总的来说,bitset 是一个很好很优的容器,也希望 STL 会越来越强!!!

浙公网安备 33010602011771号