vlib集合 - C语言通用集合模块

vlib - set集合

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) // 迭代器停止标志

方法的使用具体看仓库介绍和源代码

最后

此模块为笔者本人编写,如果喜欢希望点赞给星支持,有漏洞或者修改建议欢迎留言交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值