Hello,今天Val来分享关于位图的模拟实现。
位图c++中有源码,c++::bitset,它的主要接口有 operator[],set(),reset()、test()等等。
本篇博客主要模拟实现位图的set(),reset(),test()函数.
位图主要是用来标记一个整型的存在与否,如果存在相应的位设置为1,不存在设置为1,它的处理对象为整型,这也是它的局限性,位图标记一个整型是否存在,节省空间/快,1个字节有8个比特位,用比特位上的数字(1和0)表示对应的数是否存在。
优点:节省空间 、快
缺点:只能运用于整型
Set()某个数存在,则把相应位图的位置为1,Reset()去掉某个数,则把相应位图的位置为0.
Test()函数主要是判断一个数是否在位图里面。如何置1和置0?对位进行运算?
代码如下:
class BitMap
{
public:
BitMap(size_t range)
{
_bitMap.resize(range / 8 + 1,0);
}
void Set(size_t value)
{
size_t index = value / 8;//或者>>3 (2*2*2=8)
size_t pos = value % 8;
_bitMap[index] |= (1 << pos);
}
void Reset(size_t value)
{
size_t index = value / 8;//或者>>3 (2*2*2=8)
size_t pos = value % 8;
_bitMap[index] &= ~(1 << pos);
}
bool Test(size_t value)
{
size_t index = value / 8;
size_t pos = value % 8;
if (_bitMap[index] & (1 << pos))
{
return true;
}
else
{
return false;
}
}
protected:
vector<char> _bitMap;
};
void TestBitMap()
{
//BitMap bm(1024 * 1024 * 1024 * 4);
BitMap bm(-1);//-1 是整数的最大值 知道有多少个数据?方便扩容
bm.Set(1101);
bm.Set(1101);
bm.Set(110001);
bm.Set(1133301);
cout << bm.Test(1101) << endl;
cout << bm.Test(110100) << endl;
cout << bm.Test(110001) << endl;
}
位图能快速判断一个整型是否存在,而且很省空间,可是当数据变为其他类型比如string 就无能为力了,布隆过滤器可以解决位图的适用范围只能是整型的问题,之后Val会分享到博客上的。
时间不早了,好梦~