intset是一个对内存空间锱铢必较的有序set。使用一段连续的内存空间存储一段数据。看起来有点像数组的形式。
数据结构
typedef struct intset {
uint32_t encoding;//编码的方式 分为int16 int32 int64
uint32_t length;//数据的个数
int8_t contents[];//存储数据的点。int8_t与char 所用的字节数相同
} intset;
| encoding | length | contents[] |
encoding 4字节的长度。存储2,4,8其中一个。
length 整数存储的个数。
contents 数据存储的起点。
数据结构看起来还是挺简单的,那么我们看看其实现过程吧。
具体的API
创建一个新的set,默认使用2位16字节的int -32678~32676
这里面的interv32ifbe 是一个转换数据大小端,根据计算机的结构把所有的数据都变成以小端存储,即高位存高位数据
而大端则是高位存低位数据刚好与小端相反
intset *intsetNew(void) {
//新建intset
intset *is = zmalloc(sizeof(intset));
is->encoding = intrev32ifbe(INTSET_ENC_INT16);
//默认编码为16.
is->length = 0;
return is;
}
根据传进去的len重新设置长度
/* Resize the intset */
static intset *intsetResize(intset *is, uint32_t len) {
//重新设置大小
uint32_t size = len*intrev32ifbe(is->encoding);
is = zrealloc(is,sizeof(intset)+size);
return is;
}
接下来是查找某个整数的操作,由于数据是有序的,利用二分法进行查找。
static uint8_t intsetSearch(intset *is, int64_t value, uint32_t *pos) {
int min = 0, max = intrev32ifbe(is->length)-1, mid = -1;
int64_t cur = -1;