每日一个小问题:当你要创建一个特别大的bool数组,内存会很大,你该怎么储存呢?
答:这时就可以使用bitset了,bitset占用的空间很小,每一个值仅占用1bit
在此之前我们先来学习一下bitset吧!
1.bitset的简介
C++ 中bitset的实现在一个<bitset>头文件中,在代码开头引入这个头文件,并且同样加上一句using namespace std。
2.bitset的声明与操作
构造方法
直接构造一个bitset的语句为:bitset <16> vis;。这样我们定义了一个名为 vis的、储存长度为 16的 bitset。初始的时候 vis 的每一项均为 0。
这一步就相当于声明变量,声明了一个bitset,以后就可以用它了。
访问
可以通过 [] 访问元素(类似数组),注意最低位下标为 0,如下所示:
bitset <16> vis;
cout << vis[1] << endl;
修改
可以通过 set() 和 reset() 函数对 bitset 中某个元素进行修改。其中 set() 函数是将某个元素变为 1 或 0,reset() 函数是将某个元素变为 0。例如:
bitset <16> vis;
vis.set(); 没有参数时,是将 bitset 的每一位全部变为 1
vis.set(3); 只有一个参数时,是将对应下标位变为 1。这里处理后:
vis[3] = 1
vis.set(4,1) ;有两个参数时,是将第一个参数对应的下标位修改为第二个参数。这里处理后:vis[4] = 1
vis.reset(); 没有参数时,是将 bitset 的每一位全部变为 0
vis.reset(2);只有一个参数时,是将对应下标位变为 0。这里处理后: vis[2] = 0
思考
大家思考一下,除了 bitset 外,还有哪些数据结构可以实现标记呢?
其实 set 和 map 均可以实现。
-
set 实现标记:判断 x 是否在集合内,可以使用 count() 函数。
-
map 实现标记:判断 x 的第二关键字是否为 true。
3.每日小问题解
直接设置一个bitset就ok了
实验结果: