vlib - set集合
基本概念
set集合是逻辑上离散的容器,set的访问索引是离散的并不一定是来连续的,在插入的时候就进行了排序和索引去重。
vlib的set容器,也是具备的集合的基本属性,在底层实现上采用了“红黑树”,具有较高的增删效率,而且也支持随机访问,随机访问的时间复杂度比list要好很多。同样作为链式结构,set集合也支持迭代器。
例子
int main()
{
set_t s = set(int); // 定义并构造int型集合
set_it_t it = NULL; // 定义集合迭代器
int i = 0;
void* data = NULL;
// 插入索引并赋值为与索引相同的值
i = -10; set_insert(s, i, &i);
i = 0; set_insert(s, i, &i);
i = 2; set_insert(s, i, &i);
i = 5; set_insert(s, i, &i);
i = 100; set_insert(s, i, &i);
i = 2; printf("s[%d] = %d\r\n", i, set_at(s, int, i)); // 随机访问指定索引的数据
i = 1; printf("s[%d] = %d\r\n", i, set_at(s, int, i)); // 访问不存在的索引,保护机制使其不导致程序奔溃,而是打印了不正确的数据
set_at(s, int, 100) = 1024; printf("s[100] = %d\r\n", set_at(s, int, 100)); // 根据索引修改集合的数据
set_erase(s, 100); // 移除索引100的数据
it = set_it(s); // 不再增删操作了再来构造迭代器
printf("iterator start: \r\n");
// 迭代器获取集合的索引和数据
while (!set_it_pause(it))
{
data = set_iterator_next(it, &i);
printf("s[%d] = %d\r\n", i, *(int *)data);
}
// 使用完进行删除
_set(s);
_set_it(it);
system("pause");
return 0;
}
结果:
s[2] = 2
s[1] = -842150451
s[100] = 1024
iterator start:
s[-10] = -10
s[0] = 0
s[2] = 2
s[5] = 5
特点
- set定义为set_t类型
- set构造需确定类型,支持各种类型
- set可以很方便高效地插入索引及数据,索引插入过程去重,离散的存在
- set具备随机访问的操作,此随机访问按照红黑树二叉查找,可以高效率的随机访问
- set隐藏了集合的结点
- set提供了许多内置的操作方法,如增删改查等
- set提供了专有的迭代器,方便高效的进行遍历及其他操作
常用方法
#define set(type) // 构造
#define _set(set) // 删除
#define set_at(set, type, i) // 随机访问
int set_insert(set_t set, int index, void* data); // 插入
int set_erase(set_t set, int index); // 擦除
void set_clear(set_t set); // 清空
int set_find(set_t set, int index); // 查找
void set_swap(set_t set, set_t set_swap);
int set_size(set_t set); // 获取大小
void set_traverse(set_t set, set_traverse_t traverse); // 遍历
#define set_it(set) // 迭代器构造
#define _set_it(it) // 迭代器删除
#define set_it_to(it, type, i) // 迭代器定位
#define set_it_next(it, type) // 迭代器后移,原版 void* set_iterator_next(set_it_t it, int* out_inex); 可以输出当前迭代索引
#define set_it_prev(it, type) // 迭代器前移,原版 void* set_iterator_prev(set_it_t it, int* out_inex); 可以输出当前迭代索引
#define set_it_pause(it) // 迭代器停止标志
方法的使用具体看仓库介绍和源代码
最后
此模块为笔者本人编写,如果喜欢希望点赞给星支持,有漏洞或者修改建议欢迎留言交流。