之前我们介绍过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还有几个有用的方法:

  1. count():用于计算bitset中1的个数。

  2. any():如果bitset中有一个位是1,那么返回true,否则返回false。

  3. none ():如果bitset中每个位都是0,那么返回true,否则返回false。

  4. set ():用于将bitset中的所有位置设置成1。

  5. reset ():用于将bitset中的所有位置设置成0。

  6. flip ():用于将bitset中的所有位置反转。

和bool数组的区别

STL中的 bitset 是由固定长度的二进制位组成的数据类型,位数的范围由模板参数确定,最多可表示2^[模板参数]个值;

bool 是c++用作布尔型的类型,只能表示真或假,两个类型之间唯一的不同就是:bitset 是变长度,bool 是定长度。这意味着对于 bool,每个值都需要占用8位,而bitset可以根据实际值需要而改变长度,比如只有1位保存即可。

一般来说,bitsetbool更快,遍历的复杂度也可以从O(n)降低到O(n / w)w表示计算机位数。

总结

bitset可以用来优化程序,但由于其特殊的结构,操作它需要特别的注意。

以上就是bitset的基本操作方法,希望能帮助到大家。

本文由eriktse原创,创作不易,如果对您有帮助,欢迎小伙伴们点赞、收藏、留言

[C++STL教程]6.bitset是什么?和bool有什么区别?零基础都能看懂的入门教程的更多相关文章

  1. 文科生也能看懂的iptables教程(转载)

    据说还是个MM, 写得很通俗易懂, 还很诙谐, 原文:http://dallascao.com/cn/iptables-tutorial-for-newbies/ 对于斗胆开始玩vps的文科生来讲,i ...

  2. 最基础的Python的socket编程入门教程

    最基础的Python的socket编程入门教程 本文介绍使用Python进行Socket网络编程,假设读者已经具备了基本的网络编程知识和Python的基本语法知识,本文中的代码如果没有说明则都是运行在 ...

  3. gitbook 入门教程之小白都能看懂的 Gitbook 插件开发全流程

    什么是插件 Gitbook 插件是扩展 GitBook 功能(电子书和网站)的最佳方式. 只要是 Gitbook 默认没有提供的功能,基于插件机制都可以自行扩展,是插件让 Gitbook 变得更加强大 ...

  4. 尽量写出大家都能看懂的ReactJS入门教程

    个人感觉ReactJS相比于传统的JS框架还是挺有意思的,主要是它将JS代码和HTML代码完美的结合在了一起,有点jsp把java代码和html混在一起写的意思?但是它通过组件的形式实现了代码可复用, ...

  5. 大家都能看懂的 canvas基础教程

    原文链接: http://www.shitu91.com/cms/canvasSub/index.html 01.canvas简单的认识 canvas 是html5提供给我们的一个绘图标签 默认大小 ...

  6. PHP面向对象(OOP)编程入门教程

    面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行PHP的高级编程,对于提高 PHP编程能力和规划好Web开发构架都是非常有意义的.下面我们就 ...

  7. Docker入门教程(七)Docker API

    Docker入门教程(七)Docker API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第七篇,重点介绍了Docker Registry API和 ...

  8. Docker入门教程(五)Docker安全

    Docker入门教程(五)Docker安全 [编者的话]DockOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第五篇,介绍了Docker的安全问题,依然是老话重谈,入门者可以通 ...

  9. Docker入门教程(四)Docker Registry

    Docker入门教程(四)Docker Registry [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第四篇,介绍了Docker Registry,它 ...

  10. ActiveReports 报表控件官方中文入门教程 (3)-如何选择页面报表和区域报表

    本篇文章将介绍区域报表和页面报表的常见使用场景.区别和选择报表类型的一些建议,两种报表的模板设计.数据源(设计时和运行时)设置.和浏览报表的区别. ActiveReports 报表控件官方中文入门教程 ...

随机推荐

  1. WEB攻击与防御技术 pikachu——关于暴力破解

    首先打开XAMPP 然后在网上下载pikachu平台压缩包 解压缩即可.之后进入到XAMPP的文件夹 将pikachu文件夹放到htdoces内就完成了pikachu平台的搭建~ 之后在xampp中点 ...

  2. html 手机端适配不同手机高度 ,把内容居中显示

    手机端适配不同手机高度 ,把内容居中显示,可以将div.img.section.span.p等等元素,设置 top:50%; margin-top:xxvw; 这样可以保证主题内容居中显示.

  3. simis报错总结

    --笔记开始: 1.在前台模块处理时,[单位应收核定]比[人员缴费信息]的在职人员多一人,但是总金额一样,可能是以下原因造成!!! A.从后台看,若正常核定在职的ab08比ac13多一个人,可能是ac ...

  4. 4组-Beta冲刺-1/5

    一.基本情况 队名:摸鲨鱼小队 组长博客:https://www.cnblogs.com/smallgrape/p/15590583.html github链接:https://github.com/ ...

  5. Java流程控制1

    Scanner对象 java.util.Scanner 通过Scanner类来获取用户输入 next()和nextline()来获取输入的字符串,读取前我们一般需要使用hasnext()和hasnex ...

  6. DBEditEh/Edit 文本框内容空白时加上提示文字,输入内容时提示文字不显示

    当文本框没有输入内容且输入焦点不在文本框时,显示提示文字:"请输入帐号"当文本框得到输入焦点时提示文字不显示 unit SkinHintEdit; interface uses W ...

  7. centos安装k8s注意点

    安装方法,参考 https://blog.csdn.net/frankgy01/article/details/127936367 https://www.cnblogs.com/yangzp/p/1 ...

  8. golang学习路线

    一.golang基础 李文周的博客:https://www.liwenzhou.com/ 视频教程:https://link.juejin.cn/?target=https%3A%2F%2Fwww.b ...

  9. C#处理JSON类型数据序列化和反序列化的一点心得体会

    在处理JSON类型的数据时,定义了很多JSON类型.经常需要用到序列化和反序列化.刚开始接触到这个问题时,我给每个JSON类型都增加了类似下方的代码. using System; using Syst ...

  10. win10下Word点击链接跳转,提示“由于本机的限制,该操作已取消”

    Word按住Ctrl点击链接进行跳转,提示"由于本机的限制,该操作已取消,请联系管理员" 网上很多,修改注册表 这边要说的是,修改重启word ,还不行的解决方法:点开任务管理器- ...