整数集合 inset
(1)整数集合的定义实现
整数集合的定义为inset.h/inset
typedef struct intset {
// 编码方式
uint32_t encoding;
// 集合包含的元素数量
uint32_t length;
// 保存元素的数组
int8_t contents[];
} intset;
contents
数组:整数集合的每个元素在数组中按值的大小从小到大排序,且不包含重复项
length
记录整数集合的元素数量,即contents数组长度
encoding
决定contents数组的真正类型,如INTSET_ENC_INT16、INTSET_ENC_INT32、INTSET_ENC_INT64
例如:上图中,encoding属性的值为INTSET_ENC_INT16,表示整数集合的底层实现为int16_t类型的数组
length属性的值为5,表示整数集合包含五个元素
contents数组按照从小到大的顺序保存着集合的五个元素
- 因为每个集合元素都是int16_t类型的整数值,所以contents数组的大小等于sizeof(int16_t) * 5 = 16 * 5 = 80 位
(2)整数集合的升级
**当想要添加一个新元素到整数集合中时,并且新元素的类型比整数集合现有的所有元素的类型都要长,整数集合需要先进行升级(upgrade),才能将新元素添加到整数集合里面。**每次想整数集合中添加新元素都有可能会引起升级,每次升级都需要对底层数组已有的所有元素进行类型转换
升级添加新元素:
- 根据新元素类型,扩展整数集合底层数组的空间大小,并为新元素分配空间
- 把数组现有的元素都转换成新元素的类型,并将转换后的元素放到正确的位置,且要保持数组的有序性
- 添加新元素到底层数组
整数集合的升级策略可以提升整数集合的灵活性,并尽可能的节约内存
另外,整数集合不支持降级,一旦升级,编码就会一直保持升级后的状态
升级后新元素的摆放位置:
- 小于所有现有元素,新元素放到最开头(索引0)
- 大于所有现有元素,新元素放到最末尾(索引length - 1)