vlib - map映射
基本概念
map映射与set集合很类似,是逻辑上离散的容器,与set不同的是,set的数据存储方式是以index-data的形式存在,而map映射则是以key-value键值对的形式存在,set的index是整型data可以是任意型,而map的key可以任意型value可以是任意型。
vlib的map容器,在底层实现上采用了“红黑树”,与set一致,增删操作的效率高,而且也支持随机访问。同样作为链式结构,map也支持迭代器。
例子
int main()
{
map_t m = map(str, int); // 定义并构造键类型为字符和值类型为int的映射
map_it_t it = NULL; // 定义映射迭代器
int data = 0;
// 插入键值对
data = 170; map_insert(m, "ZhangSan", &data);
data = 174; map_insert(m, "LiSi", &data);
data = 168; map_insert(m, "WangWu", &data);
data = 180; map_insert(m, "ZhaoLiu", &data);
printf("ZhangSan heigth: %d\r\n", map_at(m, int, "ZhangSan")); // 随机访问
printf("WangWu heigth: %d\r\n", map_at(m, int, "WangWu")); // 随机访问
printf("SunQi heigth: %d\r\n", map_at(m, int, "SunQi")); // 访问不存在的键,将输入不正确的值
// 移除键值对
map_erase(m, "WangWu");
it = map_it(m); // 构造迭代器
// 开始迭代遍历,发现"WangWu"的数据已不存在
while (!map_it_pause(it))
{
printf("value = %d\r\n", map_it_next(it, int));
}
// 使用完进行删除
_map(m);
_map_it(it);
system("pause");
return 0;
}
结果:
ZhangSan heigth: 170
WangWu heigth: 168
SunQi heigth: -842150451
value = 174
value = 170
value = 180
特点
- map定义为map_t类型
- map构造需确定键和值的类型,键默认支持char、int、str(char*字符串)类型(可拓展),值可以任意类型
- map可以很方便高效地插入键值对,键插入过程去重,离散的存在
- map具备随机访问的操作,此随机访问按照红黑树二叉查找,可以高效率的随机访问
- map隐藏了映射的结点
- map提供了许多内置的操作方法,如增删改查等
- map提供了专有的迭代器,方便高效的进行遍历及其他操作
常用方法
#define map(key_type, value_type) // 构造
#define _map(map) // 删除
#define map_at(map, type, key) // 随机访问
#define map_insert(map, key, value) // 插入
#define map_erase(map, key) // 擦除
#define map_clear(map) // 清空
#define map_find(map, key) // 查找
#define map_swap(map, swap) // 交换
#define map_size(map) // 获取大小
#define map_traverse(map, traverse) // 遍历
#define map_it(map) // 迭代器构造
#define _map_it(it) // 迭代器删除
#define map_it_to(it, type, key) // 迭代器定位
#define map_it_next(it, type) // 迭代器后移
#define map_it_prev(it, type) // 迭代器前移
#define map_it_pause(it) // 迭代器停止标志
方法的使用具体看仓库介绍和源代码
最后
此模块为笔者本人编写,如果喜欢希望点赞给星支持,有漏洞或者修改建议欢迎留言交流。