Boost C++ 库

...世界上最受推崇、设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ Coding Standards

Boost.DynamicBitset :: Boost.DynamicBitset - Boost C++ 函数库

Boost.DynamicBitset

Boost.DynamicBitset 是一个可移植的库,提供了一组位。

该集合(dynamic_bitset)通过 operator[] 提供对单个位值的访问,并提供了可以应用于内置整数的所有位运算符,例如 operator&operator<<。位的数量可以在运行时更改。

dynamic_bitset 几乎与 std::bitset 相同。区别在于 dynamic_bitset 的大小(位的数量)可以在运行时更改,而 std::bitset 的大小是通过整数模板参数在编译时指定的。

dynamic_bitset 主要旨在解决的问题是表示有限集合的子集。每个位表示有限集中的元素是否在该子集中。因此,dynamic_bitset 的位运算符,例如 operator&operator|,分别对应于集合运算,例如交集和并集。

定义

每个位代表布尔值 truefalse(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”一词)。

致谢

我们要感谢 Boost 社区投入时间审查和接受这个库。由于 Boost 成员的所有建议,这个库比它本来的样子要好得多。我们特别感谢 Matt Marcus 担任审查经理。此外,还要特别感谢 James Kanze 在国际化问题上提供的宝贵帮助。