类模板std::bitset
template <size_t N> class bitset;
头文件
#include <bitset>
说明
一个bitset中保存了一些bit(字节, 只能取两个值的元素:0或1,真或假 …)
bitset模拟了一个bool类型的数组,但是优化了内存空间:总的来说,每个元素值占用一个bit(比大多数系统中最小的元素char小了8倍)
每个位置的都可以独立的访问:例如,给定一个bitset命名为foo,foo[3]访问的就是第四个元素,就像通常数组访问他的元素一样。
但是因为在C++中没有只占用一个字节的类型,bitset是通过专门的引用类型来实现每个元素单独访问的(可以查看bitset::reference)。
bitset可以通过integer值和二元内容的字符串来创建,也可以转换为interger值和字符串(查看bitset的构造函数和to_ulong、to_sting方法)。可以插入到内容为二元类型的流中,也可以从二元类型的流中提取(查看bitset适用的操作符)。
bitset的大小在编译阶段就已经确定(由模板的参数决定)。对于同样对空间进行优化并且可以动态改变大小的类,可以使用一个专门为bool类型创建的vector 类(vector)。
模板类的参数
N:指定bitset的大小,根据所占bit的数量。可以通过bitset的成员函数bitset::size来获取。size_t是一个无符号整型。
成员类型
reference
像一个类型来引用。
这是一个嵌入式类,当在一个非const的bitset对象上使用下标操作符bitset::operator[]来访问元素的时候会返回该类型。通过一个模拟指向bool类型引用的接口来访问每个元素。
原型定义:
C++11:
class bitset::reference {
friend class bitset;
reference() noexcept; // no public constructor
public:
~reference();
operator bool() const noexcept; // convert to bool
reference& operator= (bool x) noexcept; // assign bool
reference& operator= (const reference& x) noexcept; // assign bit
reference& flip() noexcept; // flip bit value
bool operator~() const noexcept; // return inverse value
}
成员函数
构造函数(c++11)
函数原型
构造一个bitset容器对象:
1.默认构造函数: 对象中的值都设置为0
2.由integer值初始化bitset对象: 使用val对应的bit值来初始化bitset对象,参考例子
3.使用string或着(4)中的C-string来初始化对象: 使用str中的0和(或)1的序列来初始化bitset对象的前n个值。
注意: 不管用哪个构造函数构造出来的bitset对象的大小是不可变的(大小由类模板的参数决定)。没有被构造函数赋值的位会被初始化为0。
参数
val: 将integer类型值对应的bits位的值拷贝到bitset对象的对应位置。
1.如果val的位数大于bitset的size大小,只将val的低位的size个bit赋值给bitset
2.如果val的位数小于bitset的size大小,不足的部分补零。
str: 用来初始化bitset对象的string或这C-string。构造函数最多解析字符串的n个字符(第三个构造函数是从pos的位置开始读取),然后依次将每个字符的值解析为0和1。【注意】最后读取的字符赋值给最低有效位,字符串下标0在高有效位(参考例子)。因此bitset的第一位的值是string的最右边的值,然后从右到左一次读取。如果string序列比bitset的size小,剩余的补零。
pos: 从string读取的起始位置,如果超过了str的长度会抛出out_of_range的异常。
zero,one: 来表示0和1的字符。
Example:
// constructing bitsets
#include <iostream> // std::cout
#include <string> // std::string
#include <bitset> // std::bitset
int main () {
std::bitset<16> foo;
std::bitset<16> bar (0xfa2);
std::bitset<16> baz (std::string("0101111001"));
std::cout << "foo: " << foo << '\n';
std::cout << "bar: " << bar << '\n';
std::cout << "baz: " << baz << '\n';
return 0;
}
Output:
foo: 0000000000000000
bar: 0000111110100010
baz: 0000000101111001
数据竞争
构造函数3和4中会访问str中的字符。
异常和安全
1和2构造函数不会抛出异常。3和4在pos大于length的时候会抛出out_of_length的异常。
适用的操作符(C++11)
对bitset中的内容执行逐位的操作。
参数
lhs: 操作符左侧的bitset对象(操作符不会修改该值)
rhs: 操作符右边的bitset对象,操作符左侧和右侧的bitset对象的size必须相同(类模板的N相等)。
pos: 要移动的位数
is,os