位图就是用一个比特位去表示一个整数,该位为1,表示此数存在,该为为0,表示此数不存在。使用位图会节省空间,并且查询,插入操作都是O(1)的,效率极高
,当然,如果你设置map的类型为unsigned char *,也是可以的,只不过这时候SHIFT = 3, MASK = 0x7
#include<iostream>
#include<string.h>
using namespace std;
#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1f
class Bitmap{
private:
int *map;
int n;
public:
Bitmap()
{
map = NULL;
n = 0;
}
Bitmap(int maxelements,int maxvalue)
{
int map_size = 1 + maxvalue/BITSPERWORD;
map = new int[map_size];
memset(map,0,sizeof(int)*(map_size));
n = 0;
}
void set(i)
{
map[i>>SHIFT] |= (1<<(i & MASK));
}
void clear(i)
{
map[i>>SHIFT] &= ~(1<<(i & MASK));
}
bool test(i)
{
return map[i>>SHIFT] & (1<<(i & MASK));
}
};