【C++】 bitset(位图)的使用

目录

一、bitset的基本介绍

1. 位图的概念

2. 位图的应用

二、biset的基本使用

1. bitset的成员函数 

2. 基本使用介绍

1. 定义方式 

2. 成员函数的使用


一、bitset的基本介绍

1. 位图的概念

        所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。

例如下面的场景:

        给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中?

  1. 遍历的方式,时间复杂度为O(N);
  2. 先将其排序(O(N*logN)),利用二分查找(logN);
  3. 位图解决

        前两种方法思路上是没有问题的,但是这里有40亿个数,若是我们要将这些数全部加载到内存当中,那么将会占用16G(40亿个整数,每个整数占4字节,那么就是160亿字节,1G = 1024*1024*1024;大约是10亿字节,所以算下来是16G)的空间,空间消耗是很大的。因此从空间消耗来看,上面这两种方法实际都是不可行的。

        位图是如何解决的呢?

         数据是否在给定的整形数据中,结果是在或者不在,刚好是 两种状态 ,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。比如:

        无符号整数总共有2^32个,因此记录这些数字就需要2^32个比特位,也就是512M的内存空间,内存消耗大大减少。

2. 位图的应用

  1. 快速查找某个数据是否在一个集合中
  2. 排序
  3. 求两个集合的交集、并集等
  4. 操作系统中磁盘块标记

二、biset的基本使用

1. bitset的成员函数 

常用成员函数功能
set设置指定位或者所有位
reset清空指定位或所有位
test获取指定位的状态
count获取被设置位的个数
size获取可以容纳的位的个数
any如果有任何一个位被设置返回true
none如果没有位被设置返回true
all如果所有位被设置返回true

2. 基本使用介绍

1. 定义方式 

#include <iostream>
#include <bitset>
#include <string>
using namespace std;

int main()
{
	//构造一个16位的位图,所有位都初始化为0 
	bitset<16> bst1; //0000 0000 0000 0000

	//构造一个16位的位图,根据所给定的值初始化位图
	bitset<16> bst2(0xfa2); //0000 1111 1010 0010

	//构造一个16位的位图,通过字符串中的0/1初始化位图
	bitset<16> bst3(string("0101111001")); //0000000101111001

	return 0;
}

2. 成员函数的使用

#include <iostream>
#include <bitset>
#include <string>
using namespace std;

int main()
{
	//构造一个16位的位图,所有位都初始化为0 
	bitset<16> bst1; //0000 0000 0000 0000
	bst1.set(0); //将bst1位图中的第0位设置为1
	bst1.set(2); //将bst1位图中的第2位设置为1
	bst1.set(4); //将bst1位图中的第4位设置为1
	bst1.set(6); //将bst1位图中的第6位设置为1
	cout << bst1 << endl; // 结果0000000001010101

	cout << bst1.size() << endl; //获取bst1位图有多少个位可以被设置,结果:16

	cout << bst1.count() << endl;//获取多少个位被设置了,结果:4

	cout << bst1.test(1) << " " << bst1.test(2) << endl;//获取第1位和第2位的状态,结果:0 1

	cout << bst1.any() << endl;  //如果bst1位图中有任何一个位被设置了,返回true,结果:1
	cout << bst1.none() << endl; //如果bst1位图中没有位被设置了,返回true,否则返回false,结果:0
	cout << bst1.all() << endl;  //如果bst1位图中所有位被设置了,返回true,否则返回false,结果:0

	cout << bst1.reset(2) << endl;//清空第2位
	cout << bst1.reset() << endl; //清空所有位

	/********bitset容器中对[ ]运算符进行了重载,我们可以直接使用[ ]对指定位进行访问或修改*******/
	bitset<16> bst2(0x0);
	cout << bst2 << endl;
	bst2[0] = 1;
	bst2[2] = 1;
	bst2[4] = 1;
	bst2[6] = 1;
	/************还有其他的运算符重载,简单试一试就可以了************/
	return 0;
}

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霄沫凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值