C++ STL bitset 容器

C++ STL bitset 容器

前置芝士

  1. 知道什么是 bool 类型;
  2. 对二进制有一定的了解。

目录

  • Part 1:什么是 bitset
  • Part 2bitset 的用法与函数
  • Part 3bitset 的使用实例
  • Part 4:总结

Part 1:什么是 bitset

C++语言的一个类库,用来方便地管理一系列的bit位而不用程序员自己来写代码。(百度百科)

对于我来说,bitset 是一个二进制数,或者可以把它看成一个 bool 类型的一维数组。

Part 2bitset 的用法

1. 声明

我们可以这样定义 bitset

 
 
 
 
 
 
 
 
#include<bitset>
...;//忽略
bitset<114514> b;
 

上面的代码中,我们定义了一个有 114514 位的 bitsetb,我们也可以看成它是一个大小为 114514bool 数组。

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⁡()falseb.none⁡()true
  • 如果 b 中至少有一位是 1,那么 b.any⁡()trueb.none⁡()false
位运算操作符
  1. ~b:返回 bitsetb 按位取反的结果;
  2. &:返回将两个 bitset 按位与的结果;
  3. |:返回将两个 bitset 按位或的结果;
  4. ^:返回将两个 bitset 按位异或的结果;
  5. >>,<<:分别返回把一个 bitset 右移和左移若干位的结果;
  6. ==,!=:分别返回两个 bitset 是否相等和是否不相等。

*4. 相比于 bool 数组,bitset 的优点

普通的一个 bool 类型的变量需要 1 个字节来存储,但是 bitset 中,每 8 位仅占用一个字节!就比如说刚刚定义的 bitsetb,它的大小为 114514,因为 114514÷8=14314.25,所以这个 bitset 仅需要 14314.25 字节就可以存储了!我们看一个实例:

 
 
 
xxxxxxxxxx
 
 
 
 
#include<bitset>
...;
bitset<100005> vis;
bool vis[100005];
 

这两个东西几乎是一样的,但是 bitset 不仅所耗的内存小,而且可直接使用的函数多,所以它明显是比 bool 数组优的。

Part 3bitset 的使用实例

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 会越来越强!!!

posted @ 2022-02-18 20:38  xiaomuyun  阅读(244)  评论(0)    收藏  举报