底层实现-intset 整数集合

用途与依赖

    整数集合(intset)是set对象的的底层实现之一。
    整数集合的底层依赖于数组,这个数组以有序、无重复的方式保存集合元素。
     如果对象是集合,并且集合中只包含整数,数量又不多,就很可能使用到这种底层编码。例如:
    sadd numbers 1 3 5 7 9
    object encoding numbers   #我们能发现是intset

用途:是其对上层提供了一种什么样的功能支撑;
依赖:对下层的依赖。
我们讨论某个层次的软件元素时,要思考其[承上启下]。

源码
intset.c
intset.h

数据结构
typedef struct intset {    
    // 保存元素所使用类型的长度
    uint32_t encoding;
    // 元素个数
    uint32_t length;
    // 保存元素的数组
    int8_t contents[];  //数组的内存与结构体的内存是相邻的
} intset;  
1.如果encoding的值是INTSET_ENC_INT16,那么contents数组的类型就会是int16_t。
其次的选项还有 INTSET_ENC_INT32与INTSET_ENC_INT64,所以contents数组的类型取决于其前的encoding。
2.contents数组的元素是从小到大有序无重复排列。
底层实现-intset 整数集合_第1张图片
注意:数组的内存与结构体的内存是相邻的


主要的API
底层实现-intset 整数集合_第2张图片

特点
升级机制
当一个要加到整数集合的新元素,当前集合的contents数组的元素类型不够长来容纳,则会升级,例如从int8_t升级到int16_t;
升级的过程需要维持数组的有序性,会逐个元素做腾挪。
因为向intset添加元素有可能引起升级,所以添加元素的时间复杂度是O(N)。
升级机制提升了灵活性、节约了存储空间。
不支持降级操作,吃胖了瘦不回去了。


启示:从intset给出的api,无外乎增删查改这几种操作,主要针对的对象有intset本身,intset的元素,intset元素的下标等。初次以外,还有查找元数据的,例如查intset占用多大,使用什么encoding这种。从这种启示,我们以后在遇到软件层次对象分析时,对api进行分析。
1.操作:增删查改
2.对象:intset本身、intset的元素、intset元素的下标。


你可能感兴趣的:(底层实现-intset 整数集合)