这个集合描述的是数值的每一个位,它的值为0或者1
要使用位集合,需要添加头文件
#include <bitset>
bitse是一个模板类,原型如下
严格来说,bitset并不属于stl容器的范畴,它也不支持指示器的操作。bitset提供了对数据的位操作。
以前将一个int值的第7位修改为1,可能需要写成
bitset提供的操作函数
函数含义test(i)测试i位的值是否为真(为1)set(i)设置第i位为1reset(i)设置第i位为0set()将所有为设置为1reset()将所有为设置为0flip(i)翻转第i位,0->1, 1->0flip()翻转所有位any()判断集合中是否包含1none()判断集合中是否全为0cout()获取被设置的位的数目size()获取所有的位的数目Effective STL第18条: 避免使用vector
vector<bool>它有两点不对
它不是一个stl容器它并不存储bool //vector内存储的T,一般支持如下操作T *p = &c[0];//但对于vector<bool>vector<bool> v;bool* q = &v[0];//编译不过原因 vector<bool>是一个假容器,它并不真的存储bool,相反,为了节省空间,它存储的是bool的紧凑表示,
sizeof(bool) = 1,在一个典型的vector中,存储的bool仅仅占一个二进制位,实际上一个bool大小的空间可以
存储8个bool。在内部,vector<bool>使用了与位域一样的思想来表达它所存储的那些bool。
位域和bool类似,它的值只有两个可能,但bool和位域之间有一个很重要的区别,你可以创建一个指向bool的指针,
但是不能创建一个指向位域的指针。指向单个位的引用也是被禁止的。
考虑取一个容器元素的地址,会产生一个指向容器元素类型的指针,在vector<bool>中是不行的。
替代std::vector的方法
使用std::deque使用std::bitset