之前我们介绍过vector, queue, stack,map,set,今天我们介绍另外一个stl容器:bitset。
🎈 作者:Eriktse
🎈 简介:19岁,211计算机在读,现役ACM银牌选手🏆力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)🚀
🎈 个人博客:www.eriktse.com
本文仅从入门和实用角度进行讲解,主要针对初学者或竞赛向。如有不严谨的地方欢迎指正!
bitset 简介
bitset
是C++标准模板库(STL)中的一种数据结构,它以十进制数的形式存储bit
(二进制位)的值。它的目的是容纳在一定的空间中存储和操作非常小的数字,因为经常只需要一位来表示某个值是true
还是false
。
bitset
可以存储大小可变的位,每一位存储一位数据,可用 true
, false
, 0
, 1
来表示,能够灵活的操作每一位。
bitset
提供一个非常有效的接口,用于在bit
向量中快速地完成检索和更新操作,是对内存和硬件资源的高效利用。
初始化
使用bitset
需要引入头文件#include <bitset>
。
用以下代码初始化一个bitset
变量。
bitset<4> bs;//初始化一个大小为4的bitset
bitset即使初始化在栈空间(非全局变量)里,也会全部初始化为0。
bitset对象的构造函数要求参数为定义一个数字,这个数字就是你要使用的位的个数。例如,
bitset<4> bs;
这个bitset<4> bs
定义一个bitset
,它具有4
个二进制位,每个位都是0
。
bitset<4> bs(5);//0101
要定义一个bitset并为每个位设定初始值,可以把对应的0和1用字符串来写
bitset<10> bs2("1010101010");
用法
其实可以直接当做一个可以做位运算的bool数组用,它经常用于动态规划中。
修改
bs[0] = 1;
cout << bs << '\n';//0001
位运算
运算符一般可以分为两类:流运算符,例如<<
和>>
;
bs <<= 1;
cout << bs << '\n';//0010
另一类是比较、赋值运算符,例如&
、|
、^
等等。
bs |= (bitset<4>(1) << 3);
cout << bs << '\n';//1010
bs &= (bitset<4>(1) << 4);
cout << bs << '\n';//1000
其他方法
bitset还有几个有用的方法:
- count():用于计算bitset中1的个数。
- any():如果bitset中有一个位是1,那么返回true,否则返回false。
- none ():如果bitset中每个位都是0,那么返回true,否则返回false。
- set ():用于将bitset中的所有位置设置成1。
- reset ():用于将bitset中的所有位置设置成0。
- flip ():用于将bitset中的所有位置反转。
和bool数组的区别
STL中的 bitset
是由固定长度的二进制位组成的数据类型,位数的范围由模板参数确定,最多可表示2^[模板参数]
个值;
bool
是c++用作布尔型的类型,只能表示真或假,两个类型之间唯一的不同就是:bitset
是变长度,bool
是定长度。这意味着对于 bool,每个值都需要占用8
位,而bitset
可以根据实际值需要而改变长度,比如只有1
位保存即可。
一般来说,bitset
比bool
更快,遍历的复杂度也可以从O(n)
降低到O(n / w)
,w
表示计算机位数。
总结
bitset
可以用来优化程序,但由于其特殊的结构,操作它需要特别的注意。
以上就是bitset
的基本操作方法,希望能帮助到大家。
🎈 本文由eriktse原创,创作不易,如果对您有帮助,欢迎小伙伴们点赞👍、收藏⭐、留言💬
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。