这一篇文章系统的学习┅下std标准库中的容器bitmap和bitsett一个bitmap和bitsett是用来储存诸多bit,这些元素可以用来表示两种状态:0或1true或false…。所以有一些时候可以很方便的用该容器快速实现状态储存
该容器通过对空间的特殊优化,使得该容器对状态的储存空间非常小相当于将若干状态储存在一个个bit上。该容器的元素访问也可以通过[n]访问容器中第n个元素但是由于一般语言没有一个bit大小的数据类型,所以这里使用了一种特殊的引用类型访问如:bitmap和bitsett::reference。
bitmap和bitsett头文件引用如下:
构造一个bitmap和bitsett方法如下所示:
总的来说,有四种方法构造一个bitmap和bitsett可参考:。
创建一个初始值均为0的n位bitmap和bitsett b |
返回pos位置的元素是否被设置或者是否为1。返回值为true或false。示例代码如下所示:
判断是否任何一个元素被設置或者判断是否至少有一个元素为1。示例代码如下:
判断一个bitmap和bitsett是否里面所有元素都为1如果都为1,则返回true;否则返回false;示例代码如丅:
有关于bitmap和bitsett的介绍暂时就先写这么多这个容器出现频次没有其他几类那么高,但是还是要知道有一些地方就可以起到出其不意的作用。
有些程序要处理二进制位的有序集每个位可能包含的是0(关)或1(开)的值。位是用来保存一组项或条件的yes/no信息(有时也称标志)的简洁方法标准库提供了bitmap和bitsett类使得處理位集合更容易一些。要使用bitmap和bitsett类就必须要包含相关的头文件在本书提供的例子中,假设都使用了std::bitmap和bitsett的using声明:
给出的长度值必须是常量表达式正如这里给出的,长度值必须定义为整型字面值常量或是已用常量值初始化的整数类型的const对象
这条语句把bitvec定义为含有32个位的bitmap囷bitsett对象。和vector的元素一样bitmap和bitsett中的位是没有命名的,程序员只能按位置来访问它们位集合的位置编号从0开始,因此bitvec的位序是从0到31。以0位開始的位串是低阶位(low-order bit)以31位结束的位串是高阶位(high-order
这里用str中从str[5]开始包含四个字符的子串来初始化bitvec5。照常初始化bitmap和bitsett对象时总是从子串最右边结尾字符开始的,bitvec5的从0到3的二进制位置为1100其他二进制位都置為0。如果省略第三个参数则意味着取从开始位置一直到string末尾的所有字符本例中,取出str末尾的四位来对bitvec6的低四位进行初始化bitvec6其余的位初始化为0。这些初始化过程的图示如下:
数,返回值的类型是size_t:
可以用下标操作符来读或写某个索引位置的二进制位同样地,也可以用下标操作符测试给定二进制位的值或设置某个二进制位的值:
只有一种类型std::bitmap和bitsett::reference。它是使用操作符[]申请非常对象时返回的一种类型;他用┅种类似bool类型的引用来访问其中的bit
*默认构造函数比特位默认设置为0
用val的值初始化对象
用str中的0或者1来初始化bitmap和bitsett对象的前n個比特
bitmap和bitsett有与构造器无关且取决于模板参数N的固定大小,那些没有显示初始化的位会被设置为0;
0
0
5.非成员类模板特例化
size()返回是位的总个数