未完成…..编辑中
bitset其实并不属于STL,而是通用工具库的一部分,是一个实现常量长度的位数组,因此其可以被看做成一个bool数组。与bool数组相比,bitset消耗更少的空间、时间并且支持位运算。
在bitset容器中,8位占一个字节,相比于bool数组4位一个字节的空间利用率要高很多。同时,n位的bitset在执行一次位运算的复杂度可以被看作是n/32,因此bitset由于原生的bool数组。
template< std::size_t N >
class bitset;
模板形参: N - 要为 bitset 分配存储的位数
构造函数
bitset有四种构造函数(参见std::bitset
#include<bitset>
#include<string>
using namespace std;
string s = "100101";
bitset<4> bitset1; //长度为4,默认为0 --> [0,0,0,0]
bitset<4> bitset2(1); //长度为4,前面用0补充 --> [0,0,0,1]
bitset<10> bitset3(s); //长度为10,前面用0补充 --> [0,0,0,0,1,0,0,1,0,1]
std::bitset<8> b7("XXXXYYYY", 8, 'X', 'Y'); // [0,0,0,0,1,1,1,1]
注意:
- 当使用字符串(char/string)时,其中只能包含参数
CharT zero
(默认为CharT('0')
)及CharT one
(默认为CharT('1')
)所指定的字符,否则会抛出异常*std::invalid_argument。- 若 pos > str.size() 则会抛出异常 std::out_of_range。
元素访问
-
bool operator[]( std::size_t pos ) const; //(C++11 前)-->(1)
constexpr bool operator[]( std::size_t pos ) const; //(C++11 起)-->(1)
reference operator[]( std::size_t pos ); //-->(2)
访问位于位置
pos
的位。首版本返回位的值,第二版本返回允许修改位的值的 std::bitset::reference 对象。
不同于 test() ,它不抛异常:若pos
在边界外则行为未定义。
返回值:- 请求位的值
- std::bitset::reference 类型对象,允许写入请求位。
-
bool test( size_t pos ) const;
返回位于位置
pos
的位的值。
不同于 operator[] ,它进行边界检查,且若pos
不对应 bitset 中的合法位置则抛出 std::out_of_range 。
返回值:
若所求位被设置则为 true ,否则为 false 。 std::bitset
::all, std::bitset ::any, std::bitset ::none //a
bool all() const noexcept;//(C++11 起)
//b
bool any() const;//(C++11 前)
bool any() const noexcept;(C++11 起)
//c
bool none() const;//(C++11 前)
bool none() const noexcept;//(C++11 起)
检查是否全部、任一或无位被设为 true :
- 检查是否全部位被设为 true 。
- 检查是否任一位被设为 true 。
- 检查是否没有位被设为 true 。
返回值
- 若全部位被设为 true 则为 true ,否则为 false
- 若任一位被设为 true 则为 true ,否则为 false
- 若没有位被设为 true 则为 true ,否则为 false
- std::bitset
::count
返回设置为true的位数。std::size_t count() const; //(C++11 前)
std::size_t count() const noexcept; //(C++11 起)
- std::bitset
- 示例: ```cpp bitset<8> foo (“10011011”);
cout << foo.count() << endl; //5 /count函数用来求bitset中1的位数,foo中共有5个1 cout << foo.size() << endl; //8 /size函数用来求bitset的大小,一共有8位
cout << foo.test(0) << endl; //true /test函数用来查下标处的元素是0还是1,并返回false或true,此处foo[0]为1,返回true cout << foo.test(2) << endl; //false /同理,foo[2]为0,返回false
cout << foo.any() << endl; //true /any函数检查bitset中是否有1 cout << foo.none() << endl; //false /none函数检查bitset中是否没有1 cout << foo.all() << endl; //false /all函数检查bitset中是全部为1
<a name="7tAm9"></a>
## 元素修改
1. **成员函数**:
- [std::bitset<N>::set](https://zh.cppreference.com/w/cpp/utility/bitset/set)
```cpp
//1
bitset<N>& set(); //(C++11 前)
bitset<N>& set() noexcept; //(C++11 起)
//2
bitset<N>& set( std::size_t pos, bool value = true );
设置所有位为 true 或到指定值:
1. 设置所有位为 `true` 。
1. 设置在 `pos` 的位为值 `value` 。
返回值: *this
- [std::bitset<N>::reset](https://zh.cppreference.com/w/cpp/utility/bitset/reset)
//1
bitset<N>& reset(); //(C++11 前)
bitset<N>& reset() noexcept; //(C++11 起)
//2
bitset<N>& reset( std::size_t pos );
设置位为 false :
1. 设置所有位为 `false` 。
1. 设置在 `pos` 的位为 `false` 。
返回值: *this
- [std::bitset<N>::flip](https://zh.cppreference.com/w/cpp/utility/bitset/flip)
//1
bitset<N>& flip(); //(C++11 前)
bitset<N>& flip() noexcept; //(C++11 起)
//2
bitset<N>& flip( std::size_t pos );
翻转位,即更改 true 值为 false 并更改 false 值为 true 。等价于在 bitset 一部分或全体上的逻辑非:
1. 翻转所有位(类似 [operator~](https://zh.cppreference.com/w/cpp/utility/bitset/operator_logic) ,但是在原位)。
1. 翻转在 `pos` 的位。
参考资料:
C++ bitset 用法—作者:长岛冰茶、
C++ STL bitset 容器详解—作者:Seaway-Fu