//E:\myprj\mylib\IntSetBitVec.h
class IntSetBitVec
{
public:
IntSetBitVec(int maxelements, int maxval);
~IntSetBitVec();
int size() { return n; }
void insert(int t);
void report(int * v);
private:
enum { BITSPERWORD = 32, SHIFT = 5, MASK = 0x1F };
int n, hi, *x;
void set(int i) { x[i>>SHIFT] |= (1 << (i & MASK)); }
void clr(int i) { x[i>>SHIFT] &= ~(1 << (i & MASK)); }
int test(int i) { return x[i>>SHIFT] & (1 << (i & MASK)); }
};
//E:\myprj\mylib\IntSetBitVec.cpp
#include "IntSetBitVec.h"
IntSetBitVec::IntSetBitVec(int maxelements, int maxval)
{
hi = maxval;
x = new int[1 + hi/BITSPERWORD];
for (int i = 0; i < hi; i++) {
clr(i);
}
n = 0;
}
IntSetBitVec::~IntSetBitVec()
{
delete [] x;
}
void IntSetBitVec::insert(int t)
{
if (test(t))
return;
set(t);
n++;
}
void IntSetBitVec::report(int * v)
{
int j = 0;
for (int i = 0; i < hi; i++) {
if (test(i))
v[j++] = i;
}
}
//
//测试
#include <cstdlib>
#include <iostream>
using namespace std;
static void gensets(int m, int maxval)
{
int * v = new int[m];
IntSetBitVec s(m, maxval);
while(s.size() < m)
{
s.insert(rand()%maxval);
}
s.report(v);
for (int i = 0; i < m; i++)
{
cout << v[i] << "\n";
}
}
void testSetBitVec(void)
{
gensets(10, 100);
}