5.整数集合(intset)
集合键的底层实现之一:当一个集合只包含整数值元素,且数量不多时,如5个
5.1 整数集合的实现
用于保存整数值的集合抽象数据结构,且保证集合中不会出现重复元素,类型可以为int16_t、int32_t、itn64_t,且按照从小到大排序
intset.h/intset:
可以看到,其底层实现为数组
而contents数组实际上保存的值不是int8_t,而是取决于encoding属性的值:
例子:包含五个int16_t类型整数值的整数集合,其contents数组大小等于sizeof(int16_t)*5=16 * 5 = 80位
注意:如果数组中存储了一个需要用int64_t类型来保存的数,那么其他数,就算可以不用int64_t存储,也会升级为int64_t,即5.2中所要说的升级
5.2 升级
每当要添加的新元素的类型比现类型长时,需要先进行升级,然后再添加
5.2.1 步骤如下:
a.根据新元素类型,扩展整数集合底层数组的空间大小,并为新元素分配空间
b.将底层数组现有的元素都转化成与新元素相同的类型,并将类型转化后的元素放置到正确的位上;且在放置元素的过程中,需要继续维持底层数组的有序性质不变
c.添加新元素
例子:
1.原数组
2.要添加int32_t类型的65535,则需要的总空间为4 * 32 = 128,即执行第a步
3.执行第b步,元素3移到索引2上,即64-95,依次类推;然后执行第c步,最后修改encoding属性为INTSET_ENC_INT32,length+1,完成添加元素操作
注意:能引发升级的新元素的位置如下;比所有元素都小的情况是最小的负数,如32位的-65536
5.2.2 升级的好处
有两个好处,如下
5.2.2.1 提升灵活性
5.2.2.2 节约内存
5.3 降级
不支持降级操作,I’m sorry,即使把当前编码唯一一个元素删除了,也会保持当前编码,不会降下来