未完成…..编辑中
bitset其实并不属于STL,而是通用工具库的一部分,是一个实现常量长度的位数组,因此其可以被看做成一个bool数组。与bool数组相比,bitset消耗更少的空间、时间并且支持位运算。

在bitset容器中,8位占一个字节,相比于bool数组4位一个字节的空间利用率要高很多。同时,n位的bitset在执行一次位运算的复杂度可以被看作是n/32,因此bitset由于原生的bool数组。

bitset定义于头文件中:

  1. template< std::size_t N >
  2. class bitset;

模板形参: N - 要为 bitset 分配存储的位数

构造函数

bitset有四种构造函数(参见std::bitset::bitset),简单的使用如下:

  1. #include<bitset>
  2. #include<string>
  3. using namespace std;
  4. string s = "100101";
  5. bitset<4> bitset1; //长度为4,默认为0 --> [0,0,0,0]
  6. bitset<4> bitset2(1); //长度为4,前面用0补充 --> [0,0,0,1]
  7. bitset<10> bitset3(s);  //长度为10,前面用0补充 --> [0,0,0,0,1,0,0,1,0,1]
  8. std::bitset<8> b7("XXXXYYYY", 8, 'X', 'Y'); // [0,0,0,0,1,1,1,1]

注意:

  1. 当使用字符串(char/string)时,其中只能包含参数 CharT zero (默认为 CharT('0') )及 CharT one (默认为 CharT('1') )所指定的字符,否则会抛出异常*std::invalid_argument
  2. 若 pos > str.size() 则会抛出异常 std::out_of_range

元素访问

  1. std::bitset::operator[]

    1. bool operator[]( std::size_t pos ) const; //(C++11 前)-->(1)
    2. constexpr bool operator[]( std::size_t pos ) const; //(C++11 起)-->(1)
    3. reference operator[]( std::size_t pos ); //-->(2)

    访问位于位置 pos 的位。首版本返回位的值,第二版本返回允许修改位的值的 std::bitset::reference 对象。
    不同于 test() ,它不抛异常:若 pos 在边界外则行为未定义。
    返回值:

    1. 请求位的值
    2. std::bitset::reference 类型对象,允许写入请求位。
  2. std::bitset::test

    1. bool test( size_t pos ) const;

    返回位于位置 pos 的位的值。
    不同于 operator[] ,它进行边界检查,且若 pos 不对应 bitset 中的合法位置则抛出 std::out_of_range
    返回值:
    若所求位被设置则为 true ,否则为 false 。

  3. std::bitset::all, std::bitset::any, std::bitset::none

    1. //a
    2. bool all() const noexcept;//(C++11 起)
    3. //b
    4. bool any() const;//(C++11 前)
    5. bool any() const noexcept;(C++11 起)
    6. //c
    7. bool none() const;//(C++11 前)
    8. bool none() const noexcept;//(C++11 起)

    检查是否全部、任一或无位被设为 true :

    1. 检查是否全部位被设为 true 。
    2. 检查是否任一位被设为 true 。
    3. 检查是否没有位被设为 true 。

返回值

  1. 若全部位被设为 true 则为 true ,否则为 false
  2. 若任一位被设为 true 则为 true ,否则为 false
  3. 若没有位被设为 true 则为 true ,否则为 false
    1. std::bitset::count
      1. std::size_t count() const; //(C++11 前)
      2. std::size_t count() const noexcept; //(C++11 起)
      返回设置为true的位数。
  1. 示例: ```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

  1. <a name="7tAm9"></a>
  2. ## 元素修改
  3. 1. **成员函数**:
  4. - [std::bitset<N>::set](https://zh.cppreference.com/w/cpp/utility/bitset/set)
  5. ```cpp
  6. //1
  7. bitset<N>& set(); //(C++11 前)
  8. bitset<N>& set() noexcept; //(C++11 起)
  9. //2
  10. bitset<N>& set( std::size_t pos, bool value = true );

设置所有位为 true 或到指定值:

  1. 1. 设置所有位为 `true`
  2. 1. 设置在 `pos` 的位为值 `value`

返回值: *this

  1. - [std::bitset<N>::reset](https://zh.cppreference.com/w/cpp/utility/bitset/reset)
  1. //1
  2. bitset<N>& reset(); //(C++11 前)
  3. bitset<N>& reset() noexcept; //(C++11 起)
  4. //2
  5. bitset<N>& reset( std::size_t pos );

设置位为 false :

  1. 1. 设置所有位为 `false`
  2. 1. 设置在 `pos` 的位为 `false`

返回值: *this

  1. - [std::bitset<N>::flip](https://zh.cppreference.com/w/cpp/utility/bitset/flip)
  1. //1
  2. bitset<N>& flip(); //(C++11 前)
  3. bitset<N>& flip() noexcept; //(C++11 起)
  4. //2
  5. bitset<N>& flip( std::size_t pos );

翻转位,即更改 true 值为 false 并更改 false 值为 true 。等价于在 bitset 一部分或全体上的逻辑非:

  1. 1. 翻转所有位(类似 [operator~](https://zh.cppreference.com/w/cpp/utility/bitset/operator_logic) ,但是在原位)。
  2. 1. 翻转在 `pos` 的位。

参考资料
C++ bitset 用法—作者:长岛冰茶、
C++ STL bitset 容器详解—作者:Seaway-Fu