Boost.DynamicBitset
Boost.DynamicBitset 是一个可移植的库,提供了一组位。
该集合(dynamic_bitset)通过 operator[] 提供对单个位值的访问,并提供了可以应用于内置整数的所有位运算符,例如 operator& 和 operator<<。位的数量可以在运行时更改。
dynamic_bitset 几乎与 std::bitset 相同。区别在于 dynamic_bitset 的大小(位的数量)可以在运行时更改,而 std::bitset 的大小是通过整数模板参数在编译时指定的。
dynamic_bitset 主要旨在解决的问题是表示有限集合的子集。每个位表示有限集中的元素是否在该子集中。因此,dynamic_bitset 的位运算符,例如 operator& 和 operator|,分别对应于集合运算,例如交集和并集。
定义
每个位代表布尔值 true 或 false(1 或 0)。设置一个位是为其分配 1。清除或重置一个位是为其分配 0。翻转一个位是将其值更改为 1(如果它是 0)或 0(如果它是 1)。每个位都有一个非负位置。位集 x 包含 x.size() 个位,每个位在范围 [0, x.size()) 内被分配一个唯一的位置。位置 0 的位称为最低有效位,位置 size() - 1 的位称为最高有效位。在将 dynamic_bitset 的实例转换为或从无符号长整型 n 转换时,位集中位置 i 的位的值与 (n >> i) & 1 相同。
原理
由于代理引用类型,dynamic_bitset 不是 Container,其迭代器不满足 LegacyForwardIterator 的要求。这意味着其迭代器不能与许多标准算法一起使用。但是,dynamic_bitset 提供了 C++20 迭代器,可以与 ranges 一起使用。
有些人更喜欢“toggle”而不是“flip”。选择“flip”这个名字是因为 std::bitset 中使用了这个名字。事实上,dynamic_bitset 的大部分函数名都是出于这个原因而选择的。
dynamic_bitset 在违反先决条件时不会抛出异常(这在 std::bitset 中会发生)。取而代之的是使用 BOOST_ASSERT()。有关解释,请参阅错误和异常处理指南。请注意,与此一致的是,成员函数的文档不使用“先决条件”一词来描述会导致发出异常的条件(C++ 标准在此类情况下使用“requires”一词)。