bitset
介绍¶
std :: bitset 是标准库中的一个 固定大小 序列,其储存的数据只包含 0/1
众所周知,由于内存地址是按字节即 byte 寻址,而非比特 bit ,
我们一个 bool 类型的变量,虽然只能表示 0/1 , 但是也占了 1byte 的内存
bitset 就是通过固定的优化,使得一个字节的八个比特能分别储存 8 位的 0/1
对于一个 4 字节的 int 变量,在只存 0/1 的意义下, bitset 占用空间只是其
在某些情况下通过 bitset 可以使你的复杂度除以 32
当然, vector 的一个特化 vector<bool> 的储存方式同 bitset 一样,区别在于其支持动态开空间,
bitset 则和我们一般的静态数组一样,是在编译时就开好了的。
那么为什么要用 bitset 而非 vector<bool> ?
通过以下的介绍,你可以更加详细的看到 bitset 具备的方便操作
1 | #include <bitset> // 包含 bitset 的头文件 |
运算符¶
operator[]: 访问其特定的一位operator ==/!=: 比较两个bitset内容是否完全一样operator &=/|=/^=/~: 进行按位与/或/异或/取反操作operator <</>>/<<=/>>=: 进行二进制左移/右移operator <</>>: 流运算符,这意味着你可以通过cin/cout进行输入输出vector<bool>只具有前两项
成员函数¶
test(): 它和vector中的at()的作用是一样的,和[]运算符的区别就是越界检查count(): 返回true的数量set(): 将整个bitset设置成true, 你也可以传入参数使其设置成你的参数reset(): 将整个bitset设置成falseflip(): 翻转该位 (0 变 1,1 变 0), 相当于逻辑非/异或 1to_string(): 返回转换成的字符串表达to_ulong(): 返回转换成的unsigned long表达 (long在 NT 及 32 位 POSIX 系统下与int一样,在 64 位 POSIX 下与long long一样)to_ullong()C++11 , 返回转换成的unsigned long long表达
这些 vector<bool> 基本都没有
作用¶
一般来讲,我们可以用 bitset 优化一些可行性 DP, 或者线筛素数 ( notprime 这种 bool 数组可以用 bitset 开到
它最主要的作用还是压掉了内存带来的时间优化,
其实 bitset 不光是一个容器,更是一种思想,我们可以通过手写的方式,来把 long long 什么的压成每 bit 表示一个信息,用 STL 的原因更多是因为它的运算符方便
build本页面最近更新:,更新历史
edit发现错误?想一起完善? 在 GitHub 上编辑此页!
people本页面贡献者:
copyright本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用