• C++ STL bitset 容器详解


    C++ STL bitset 容器详解

    本篇随笔讲解(C++STL)(bitset)容器的用法及常见使用技巧。

    (bitset)容器概论

    (bitset)容器其实就是个(01)串。可以被看作是一个(bool)数组。它比(bool)数组更优秀的优点是:节约空间,节约时间,支持基本的位运算。(bitset)容器中,(8)位占一个字节,相比于(bool)数组(4)位一个字节的空间利用率要高很多。同时,(n)位的(bitset)在执行一次位运算的复杂度可以被看作是(n/32),这都是(bool)数组所没有的优秀性质。

    (bitset)容器包含在(C++)自带的(bitset)库中。

    #include<bitset>
    

    (bitset)容器的声明

    因为(bitset)容器就是装(01)串的,所以不用在< >中装数据类型,这和一般的(STL)容器不太一样。< >中装(01)串的位数

    如:(声明一个(10^5)位的(bitset)

    bitset<100000> s;
    

    (bitset)容器的一些操作

    1、常用的操作函数

    和其他的(STL)容器一样,对(bitset)的很多操作也是由自带函数来实现的。下面,我们来介绍一下(bitset)的一些常用函数及其使用方法。

    • (count())函数

    (count),数数的意思。它的作用是数出(1)的个数。即(s.count())返回(s)中有多少个(1).

    s.count();
    
    • (any()/none())函数

    (any),任何的意思。(none),啥也没有的意思。这两个函数是在检查(bitset)容器中全(0)的情况。

    如果,(bitset)中全都为(0),那么(s.any())返回(false)(s.none())返回(true)

    反之,假如(bitset)中至少有一个(1),即哪怕有一个(1),那么(s.any())返回(true)(s.none())返回(false).

    s.any();
    s.none();
    
    • (set())函数

    (set())函数的作用是把(bitset)全部置为(1).

    特别地,(set())函数里面可以传参数。(set(u,v))的意思是把(bitset)中的第(u)位变成(v,vin 0/1)

    s.set();
    s.set(u,v);
    
    • (reset())函数

    (set())函数相对地,(reset())函数将(bitset)的所有位置为(0)。而(reset())函数只传一个参数,表示把这一位改成(0)

    s.reset();
    s.reset(k);
    
    • (flip())函数

    (flip())函数与前两个函数不同,它的作用是将整个(bitset)容器按位取反。同上,其传进的参数表示把其中一位取反。

    s.flip();
    s.flip(k);
    

    2、位运算操作在(bitset)中的实现

    (bitset)的作用就是帮助我们方便地实现位运算的相关操作。它当然支持位运算的一些操作内容。我们在编写程序的时候对数进行的二进制运算均可以用在(bitset)函数上。

    比如:

    ~:按位取反

    &:按位与

    |:按位或

    ^:按位异或

    << >>:左/右移

    ==/!=:比较两个(bitset)是否相等。

    关于位运算的相关知识,不懂的小伙伴请戳这里:

    常用的位运算技巧

    另外,(bitset)容器还支持直接取值和直接赋值的操作:具体操作方式如下:

    s[3]=1;
    s[5]=0;
    

    这里要注意:在(bitset)容器中,最低位为(0)。这与我们的数组实现仍然有区别。

    (bitset)容器的实际应用

    (bitset)可以高效率地对(01)串,(01)矩阵等等只含(0/1)的题目进行处理。其中支持的许多操作对我们处理数据非常有帮助。如果碰到一道(0/1)题,使用(bitset)或许是不错的选择。

  • 相关阅读:
    列式数据库
    Subway POJ
    操作系统知识汇总
    Linux工具指南
    常用数据结构
    bzoj1257: [CQOI2007]余数之和 整除分块
    HDU
    hdu1693 Eat the Trees 插头dp
    HDU
    poj2411 轮廓线dp裸题
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11720118.html
Copyright © 2020-2023  润新知