[C++STL教程]6.bitset是什么?和bool有什么区别?零基础都能看懂的入门教程
之前我们介绍过vector, queue, stack,map,set,今天我们介绍另外一个stl容器:bitset。
作者:Eriktse
简介:19岁,211计算机在读,现役ACM银牌选手力争以通俗易懂的方式讲解算法!️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)
个人博客:www.eriktse.com
本文仅从入门和实用角度进行讲解,主要针对初学者或竞赛向。如有不严谨的地方欢迎指正!
bitset 简介
bitset是C++标准模板库(STL)中的一种数据结构,它以十进制数的形式存储bit(二进制位)的值。它的目的是容纳在一定的空间中存储和操作非常小的数字,因为经常只需要一位来表示某个值是true还是false。
bitset可以存储大小可变的位,每一位存储一位数据,可用 true, false, 0, 1 来表示,能够灵活的操作每一位。
bitset提供一个非常有效的接口,用于在bit向量中快速地完成检索和更新操作,是对内存和硬件资源的高效利用。
初始化
使用bitset需要引入头文件#include <bitset>。
用以下代码初始化一个bitset变量。
bitset<4> bs;//初始化一个大小为4的bitset
bitset即使初始化在栈空间(非全局变量)里,也会全部初始化为0。
bitset对象的构造函数要求参数为定义一个数字,这个数字就是你要使用的位的个数。例如,
bitset<4> bs;
这个bitset<4> bs定义一个bitset,它具有4个二进制位,每个位都是0。
bitset<4> bs(5);//0101
要定义一个bitset并为每个位设定初始值,可以把对应的0和1用字符串来写
bitset<10> bs2("1010101010");
用法
其实可以直接当做一个可以做位运算的bool数组用,它经常用于动态规划中。
修改
bs[0] = 1;
cout << bs << '\n';//0001
位运算
运算符一般可以分为两类:流运算符,例如<<和>>;
bs <<= 1;
cout << bs << '\n';//0010
另一类是比较、赋值运算符,例如&、|、^等等。
bs |= (bitset<4>(1) << 3);
cout << bs << '\n';//1010
bs &= (bitset<4>(1) << 4);
cout << bs << '\n';//1000
其他方法
bitset还有几个有用的方法:
count():用于计算bitset中1的个数。
any():如果bitset中有一个位是1,那么返回true,否则返回false。
none ():如果bitset中每个位都是0,那么返回true,否则返回false。
set ():用于将bitset中的所有位置设置成1。
reset ():用于将bitset中的所有位置设置成0。
flip ():用于将bitset中的所有位置反转。
和bool数组的区别
STL中的 bitset 是由固定长度的二进制位组成的数据类型,位数的范围由模板参数确定,最多可表示2^[模板参数]个值;
bool 是c++用作布尔型的类型,只能表示真或假,两个类型之间唯一的不同就是:bitset 是变长度,bool 是定长度。这意味着对于 bool,每个值都需要占用8位,而bitset可以根据实际值需要而改变长度,比如只有1位保存即可。
一般来说,bitset比bool更快,遍历的复杂度也可以从O(n)降低到O(n / w),w表示计算机位数。
总结
bitset可以用来优化程序,但由于其特殊的结构,操作它需要特别的注意。
以上就是bitset的基本操作方法,希望能帮助到大家。
本文由eriktse原创,创作不易,如果对您有帮助,欢迎小伙伴们点赞、收藏、留言
[C++STL教程]6.bitset是什么?和bool有什么区别?零基础都能看懂的入门教程的更多相关文章
- 文科生也能看懂的iptables教程(转载)
据说还是个MM, 写得很通俗易懂, 还很诙谐, 原文:http://dallascao.com/cn/iptables-tutorial-for-newbies/ 对于斗胆开始玩vps的文科生来讲,i ...
- 最基础的Python的socket编程入门教程
最基础的Python的socket编程入门教程 本文介绍使用Python进行Socket网络编程,假设读者已经具备了基本的网络编程知识和Python的基本语法知识,本文中的代码如果没有说明则都是运行在 ...
- gitbook 入门教程之小白都能看懂的 Gitbook 插件开发全流程
什么是插件 Gitbook 插件是扩展 GitBook 功能(电子书和网站)的最佳方式. 只要是 Gitbook 默认没有提供的功能,基于插件机制都可以自行扩展,是插件让 Gitbook 变得更加强大 ...
- 尽量写出大家都能看懂的ReactJS入门教程
个人感觉ReactJS相比于传统的JS框架还是挺有意思的,主要是它将JS代码和HTML代码完美的结合在了一起,有点jsp把java代码和html混在一起写的意思?但是它通过组件的形式实现了代码可复用, ...
- 大家都能看懂的 canvas基础教程
原文链接: http://www.shitu91.com/cms/canvasSub/index.html 01.canvas简单的认识 canvas 是html5提供给我们的一个绘图标签 默认大小 ...
- PHP面向对象(OOP)编程入门教程
面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行PHP的高级编程,对于提高 PHP编程能力和规划好Web开发构架都是非常有意义的.下面我们就 ...
- Docker入门教程(七)Docker API
Docker入门教程(七)Docker API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第七篇,重点介绍了Docker Registry API和 ...
- Docker入门教程(五)Docker安全
Docker入门教程(五)Docker安全 [编者的话]DockOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第五篇,介绍了Docker的安全问题,依然是老话重谈,入门者可以通 ...
- Docker入门教程(四)Docker Registry
Docker入门教程(四)Docker Registry [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第四篇,介绍了Docker Registry,它 ...
- ActiveReports 报表控件官方中文入门教程 (3)-如何选择页面报表和区域报表
本篇文章将介绍区域报表和页面报表的常见使用场景.区别和选择报表类型的一些建议,两种报表的模板设计.数据源(设计时和运行时)设置.和浏览报表的区别. ActiveReports 报表控件官方中文入门教程 ...
随机推荐
- mySql查询-系统公告发布接收人情况
-- display_name NZ分部所有用户SELECT user_code,display_name FROM scy_user WHERE ou_id=1627 AND is_deleted= ...
- react和vue的区别及优缺点
区别: vue是双向绑定的,采用template: react是单向的,采用jsx. Vue的优缺点: 简单.快速.强大.对模块友好,但不支持IE8. React的优缺点: 速度快.跨浏览器兼容.模块 ...
- 【PyQt6】Python使用QtCharts画图修改背景色的问题
问题 想在软件界面用PyQt6的QtChart新画一张饼图,自定义一个饼图类继承QChartView: class PyPieChart(QChartView): def __init__( self ...
- 后台http请求
HttpResponse response = HttpContext.Current.Response; response.Buffer = true; response.Clear(); resp ...
- vue创建项目的命令
一.首先下载node环境 二.全局安装vue-cli cnpm i -g @vue/cli 这里一定要注意是vue/cli,而不是vue-cli 三.新建文件夹,打开cmd命令 1.vue creat ...
- docker出现“Failing to start dockerd: failed to create NAT chain DOCKER”错误
使用Windows的WSL 2里面的Ubuntu安装docker之后,启动docker服务一直失败,提示Docker is not running.使用dockerd命令会出现如下错误: INFO[2 ...
- C语言初级阶段5——函数2
C语言初级阶段5--函数2 址传递 1.地址:在定义变量,数组,函数等等,系统会自动给分配他们的内存区域(地址),把这个数据放到这个地址上面. 2.&:&a 得到a的地址编号 3.*: ...
- 3、HTTP请求头与响应头
HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...
- 05 HDFS Java API应用实例
一.在Ubuntu系统中安装和配置Eclipse 二.利用hadoop 的java api,向HDFS写一个文件. 三.从HDFS读取一个文件的内容.
- element ui动态生成表单数据与校验(后台传入数据)
前言 最近有一个需求是通过后台返回的数据,生成表单并添加校验.在做的过程中,动态表单挺好做,关键是校验.困扰了我2天,最后通过查找资料和"运气"终于解决了.解决问题关键点:vue的 ...