bitset

bitset


std::bitset

这个集合描述的是数值的每一个位,它的值为0或者1
要使用位集合,需要添加头文件
#include <bitset>
bitse是一个模板类,原型如下

template <size_t N> //N对应待处理的位数
class bitset
{...}
std::bitset<32> i;
std::bitset<sizeof(int)> i;

严格来说,bitset并不属于stl容器的范畴,它也不支持指示器的操作。bitset提供了对数据的位操作。
以前将一个int值的第7位修改为1,可能需要写成

//这样的操作不清晰
int i = 1;
i |= 128;
//改为bitset处理
std::bitset<32> i;
i = 1;
std::cout << i << std::endl;
i[7] =  1;
std::cout << i << std::endl;

bitset提供的操作函数

函数含义
test(i)测试i位的值是否为真(为1)
set(i)设置第i位为1
reset(i)设置第i位为0
set()将所有为设置为1
reset()将所有为设置为0
flip(i)翻转第i位,0->1, 1->0
flip()翻转所有位
any()判断集合中是否包含1
none()判断集合中是否全为0
cout()获取被设置的位的数目
size()获取所有的位的数目

Effective STL

第18条: 避免使用vector

vector<bool>它有两点不对

  1. 它不是一个stl容器
  2. 它并不存储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的方法

  1. 使用std::deque
  2. 使用std::bitset
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值