C++之std::bitset使用精讲(全)
目录
1.简介
2.定义与初始化
3.操作接口
4.高级用法
5.线程安全性
6.std::bitset的应用
6.1快速判断某个数据是否在一个集合中
6.2.求两个集合的交集、并集等
6.3.数据统计次数
7.总结
1.简介
std::bitset也叫位图,它的定义如下:
template class bitset
类模板 bitset 表示一个 N 位的固定大小序列。可以用标准逻辑运算符操作 bitset,并将它与字符串和整数相互转换。对于字符串表示和移位操作的列举方向来说,这个序列被当做最低索引元素位于右侧,类似于整数的二进制表示。这个类提供了一些方便的方法来操作位,例如设置、重置、翻转位等。
2.定义与初始化
std::bitset 满足可复制构造 (CopyConstructible) 及可复制赋值 (CopyAssignable) 的要求。
下面是 std::bitset 类型的创建方式:
std::bitset bitset1; // 创建一个长度为 N 的 bitset,所有位都被初始化为 0 std::bitset bitset2(value); // 使用二进制整数 value 初始化一个长度为 N 的 bitset std::bitset bitset21(0xffff); // bits 0 ... 15 are set to 1; 16 ... 31 are 0 std::bitset bitset22(0xffff); // bits 32 through 127 initialized to zero std::bitset bitset3(string); // 使用二进制字符串 string 初始化一个长度为 N 的 bitset string str("1111111000000011001101"); std::bitset bitset31(str); //用整个字符串来初始化bitset std::bitset bitset32(str, 5, 4); // 4 bits starting at str[5], 1100 std::bitset bitset33(str, str.size() - 4); // use last 4 characters std::bitset bitset4(bitset); // 使用另一个 bitset 初始化一个长度为 N 的 bitset std::bitset bitset5(bitset4, pos, n); //bitset5是bitset4中从位置pos开始的n个位的副本
类似于vector,bitset类是一种类模板;而与vector不一样的是bitset类型对象的区别仅在其长度而不在其类型。在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度值:
bitset bitvec; //32位,全为0。
给出的长度值必须是常量表达式。正如这里给出的,长度值必须定义为整型字面值常量或是已用常量值初始化的整数类型的const对象。
这条语句把bitvec定义为含有32个位的bitset对象。和vector的元素一样,bitset中的位是没有命名的,程序员只能按位置来访问它们。位集合的位置编号从0开始,因此,bitvec的位序是从0到31。以0位开始的位串是低阶位(low-order bit),以31位结束的位串是高阶位(high-order bit)。
3.操作接口
多种bitset操作用来测试或设置bitset对象中的单个或多个二进制位:
这些函数使得 std::bitset 成为处理位级别数据的强大工具。示例如下:
#include #include #include #include int main() { typedef std::size_t length_t, position_t; // 提示 // 构造函数: constexpr std::bitset b1; constexpr std::bitset b2{0xA}; // == 0B1010 std::bitset b3{"0011"}; // C++23 起也可以为 constexpr std::bitset b4{"ABBA", length_t(4), /*0:*/'A', /*1:*/'B'}; // == 0B0000'0110 // 能打印出 bitset 到流: std::cout