set的一种优化数据结构
试用于元素数量较少
元素类型为int16_t,int32_t,int64_t
的情况
本质是uint8_t[]
set的编码会根据内容元素自动变更
不需要手动变更编码
从小到大递增排序
相关文件
- intset.h
- intset.c
相关概念
- rand
随机数生成
范围:0-RAND_MAX
RAND_MAX:系统相关,至少为32767 - 大小端
- 大端
高位字节存放在内存的低位地址中
就是和阅读顺序一致,高位放在前面的低位地址中 - 小端
低位字节存放在内存的低位地址中 - 网络字节序
就是大端字节序 - 本地字节序
根据机器不同而不同
- 大端
数据结构
1 | typedef struct intset { |
主要宏
1 | /* Note that these encodings are ordered, so: |
函数分析
static uint8_t _intsetValueEncoding(int64_t v);
功能
判断存储v需要的编码类型长度
源码
1 | /* Return the required encoding for the provided value. */ |
static int64_t _intsetGetEncoded(intset *is, int pos, uint8_t enc);
功能
根据指定编码获取intset的指定位置的值
源码
1 | /* Return the value at pos, given an encoding. */ |
static int64_t _intsetGet(intset *is, int pos);
功能
根据intset的编码类型获取指定位置的值
源码
1 | /* Return the value at pos, using the configured encoding. */ |
static void _intsetSet(intset *is, int pos, int64_t value);
功能
根据intset的编码类型设置指定位置的值
源码
1 | /* Set the value at pos, using the configured encoding. */ |
intset *intsetNew(void);
功能
创建一个空的intset
源码
1 | /* Create an empty intset. */ |
static intset *intsetResize(intset *is, uint32_t len);
功能
为intset重新分配内存大小
源码
1 | /* Resize the intset */ |
static uint8_t intsetSearch(intset *is, int64_t value, uint32_t *pos);
功能
查找value在intset的位置
返回是否找到
pos指针为value的位置或可以插入到的位置
源码
1 | /* Search for the position of "value". Return 1 when the value was found and |
static intset *intsetUpgradeAndAdd(intset *is, int64_t value);
功能
当编码类型发生扩大时调用,
整体扩展intset的所有数据到更大的数据编码
并将value的值插入到intset的开头或结尾
必然在开头或结尾的原因是大的数据结构的取值范围一定大于小的数据结构
所以整数肯定在最后,负数肯定在起始位置
源码
1 | /* Upgrades the intset to a larger encoding and inserts the given integer. */ |
static void intsetMoveTail(intset *is, uint32_t from, uint32_t to);
功能
将intset的连续内存地址从from开始到数据结尾移动到to的位置
就是为插入/删除数据操作封装的移动数据的接口
源码
1 | static void intsetMoveTail(intset *is, uint32_t from, uint32_t to) { |
intset *intsetAdd(intset *is, int64_t value, uint8_t *success);
功能
添加一个新的值
success:成功失败
返回新的intset指针
源码
1 | /* Insert an integer in the intset */ |
intset *intsetRemove(intset *is, int64_t value, int *success);
功能
删除value的值
success表示是否成功
源码
1 | /* Delete integer from intset */ |
uint8_t intsetFind(intset *is, int64_t value);
功能
查找值是否在intset中
源码
1 | /* Determine whether a value belongs to this set */ |
int64_t intsetRandom(intset *is);
功能
获取随机的元素
源码
1 | /* Return random member */ |
uint8_t intsetGet(intset *is, uint32_t pos, int64_t *value)
功能
获取intset指定位置的值
返回成功失败
源码
1 | /* Sets the value to the value at the given position. When this position is |
uint32_t intsetLen(intset *is);
功能
获取intset的数据个数
源码
1 | /* Return intset length */ |
size_t intsetBlobLen(intset *is);
功能
获取intset的占用内存空间
全部空间(结构体大小+数据量大小)
源码
1 | /* Return intset blob size in bytes. */ |