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,v\in 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\)或许是不错的选择。

C++ STL bitset 容器详解的更多相关文章

  1. 2.3 C++STL vector容器详解

    文章目录 2.3.1 引入 2.3.2 代码实例 2.3.3 运行结果 总结 2.3.1 引入 vector 容器 动态数组 可变数组 vector容器 单口容器(尾部操作效率高) vector动态增 ...

  2. 2.7 C++STL list容器详解

    文章目录 2.7.1 引入 2.7.2代码示例 2.7.3代码运行结果 总结 2.7.1 引入 STL list 容器,又称双向链表容器,即该容器的底层是以双向链表的形式实现的.这意味着,list 容 ...

  3. 2.2 C++STL string容器详解

    文章目录 引言 2.2.1 string的特性 2.2.2 string用法理论 2.2.2.1 string构造函数 2.2.2.2 string赋值操作 2.2.2.3 string取值操作 2. ...

  4. 2.4 C++STL deque容器详解

    文章目录 2.4.1 引入 2.4.2 代码示例 2.4.3 代码运行结果 2.4.4 具体案例 总结 2.4.1 引入 deque容器类比vector容器来学习. deque为双向开口容器,见下图. ...

  5. STL bind1st bind2nd详解

    STL bind1st bind2nd详解   先不要被吓到,其实这两个配接器很简单.首先,他们都在头文件<functional>中定义.其次,bind就是绑定的意思,而1st就代表fir ...

  6. [Spring学习笔记 1 ] Spring 简介,初步知识--Ioc容器详解 基本原理。

    一.Spring Ioc容器详解(1) 20131105 1.一切都是Bean Bean可是一个字符串或者是数字,一般是一些业务组件. 粒度一般比较粗. 2.Bean的名称 xml配置文件中,id属性 ...

  7. 跟我一起学STL(2)——vector容器详解

    一.引言 在上一个专题中,我们介绍了STL中的六大组件,其中容器组件是大多数人经常使用的,因为STL容器是把运用最广的数据结构实现出来,所以我们写应用程序时运用的比较多.然而容器又可以序列式容器和关联 ...

  8. list容器详解

    首先说说STL ( STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件.STL现在是C++的一部分,因此不用额外安装什么.它被内建在你的编译器之内.因为STL的list是一个简单的容器, ...

  9. STL之vector容器详解

    vector 容器 vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说: ...

随机推荐

  1. WPF 动态生成对象属性 (dynamic)

    原文:WPF 动态生成对象属性 (dynamic) 项目中列行的数据 都需要动态生成 所以考虑到对象绑定  可需要一个动态生成属性的意思 缺点 加载速度会慢 很明显的慢 解决办法 尽量减轻动态属性的量 ...

  2. 使用vmware workstation安装centos 7操作系统

    安装步骤 1.点击创建虚拟机,进入新建虚拟机向导,选择自定义,典型:相当于去电脑 旗舰店里店员推荐的是一样,推荐的比一定好,自定义:是手动操作的,没有linux基础最好选择自定义.点击下一步. 2.虚 ...

  3. 【2019.8.15 慈溪模拟赛 T2】组合数(binom)(卢卡斯定理+高维前缀和)

    卢卡斯定理 题目中说到\(p\)是质数. 而此时要求组合数向质数取模的结果,就可以用卢卡斯定理: \[C_x^y=C_{x\ div\ p}^{y\ div\ p}\cdot C_{x\ mod\ p ...

  4. php time() 和 $_SERVER['REQUEST_TIME']

    time() 和 $_SERVER['REQUEST_TIME']效率 结果:(其中之一) 结论: time() : 执行时间在0.10 - 0.30 之间 $_SERVER['REQUEST_TIM ...

  5. python保存文字到文件中

    使用encode方法即可,举例如下: #-*-coding:utf-8-*- def save(re, name): file = open("index_cut.txt", &q ...

  6. 实验:用Unity抓取指定url网页中的所有图片并下载保存

    突发奇想,觉得有时保存网页上的资源非常麻烦,有没有办法输入一个网址就批量抓取对应资源的办法呢. 需要思考的问题: 1.如何得到网页url的html源码呢? 2.如何在浩瀚如海的html中匹配出需要的资 ...

  7. Python 如何操作微信

    1.给文件传输助手发一条消息 import itchat itchat.auto_login(enableCmdQR=True) # 这里需要你人工手机扫码登录 itchat.send('Hello, ...

  8. 失败zero

    1127 系统玩崩溃了 分区助手调整c盘,导致自动进入快速启动然后疯狂boot网卡检测?还有测试中心? 查找错误initialization and establishing link,结论是bios ...

  9. HashMap中 工具方法tableSizeFor的作用

    [转] https://blog.csdn.net/fan2012huan/article/details/51097331 首先看下该方法的定义以及被使用的地方 static final int t ...

  10. Elasticsearch 6.x版本全文检索学习之Search API

    Elasticsearch 6.x版本全文检索学习之Search API. 1).Search API,实现对es中存储的数据进行查询分析,endpoind为_search,如下所示. 方式一.GET ...