表 map
1 概述
本章节涵盖 map表的概念,表的创建、增删改查,隐式行为,底层的内存拓展机制以及指向表相关操作的文档链接。
本章节内容主要面向需要学习 GS map 表的基础概念,了解 GS 表的基础操作,了解 GS 标的底层内存拓展机制 GS 编程初学者。
在阅读完本章节后应掌握表的概念、表的使用场景、表的创建、增删改查,以及表的隐式行为及内存拓展机制,提升表的性能优化理解。
2 表的概念
GS 中的 map表是通过哈希表(Hash Table)实现的,是一种使用哈希函数将键(Key,如名字、ID)快速映射到存储位置,从而实现高效数据存储和查找的数据结构。
你可以把它想象成一个有很多抽屉的柜子,每个抽屉都有编号。存放东西时,根据东西的“名字”(键)通过一个特定规则(哈希函数)算出它应该放在哪个抽屉里。找东西时,再用同样的规则直接去那个抽屉拿,非常快。
2.1 核心概念
- 键值对存储:每个元素由键(Key)和值(Value)组成,键是唯一的标识符,值是与键关联的数据。
- 哈希函数:通过哈希函数将键转换为数组索引,实现快速访问。
- 动态扩展:表的大小可以根据需要动态调整,无需预先指定容量。
2.2 典型使用场景
- 配置管理:存储程序的配置参数,如
{"host": "localhost", "port": 8080}。 - 数据缓存:缓存频繁访问的数据,提高查询效率。
- 字典映射:实现单词翻译、ID到对象的映射等功能。
- 游戏开发:存储游戏角色的属性、物品的详细信息等。
一个简单的使用场景实例如下:
// 示例:使用 map 存储游戏角色属性
map character = {
"name": "Knight",
"health": 100,
"attack": 20,
"defense": 10
};
writeln(character);
示例2-1:表的使用场景示例
3 表的基础
3.1 表的声明
表的变量声明以 map作为类型名,未初始化时默认值为 nil。示例如下:
map m_default; // 默认值为 nil
map m_init = {}; // 初始化为空表
writeln(m_default); // 输出: nil
writeln(m_init); // 输出: { }
示例3-1:表的声明
输出结果如下:
nil
{ }
3.2 表的创建
GS 支持两种常见的表创建方式:
- 字面量初始化:使用
{}直接定义键值对。 - 预分配空间:使用
map.allocate方法申请指定大小的表。
示例如下:
// 字面量创建表
map m_profess = {"profess": "knight", "attack": 20};
// 预分配空间的表
map m_monsters = map.allocate(256);
writeln(m_profess); // 输出表的键值对
writeln(m_monsters); // 输出空表
writeln(m_profess.capacity()); // 输出实际容量
writeln(m_monsters.capacity()); // 输出实际容量
示例3-2:表的创建
输出结果如下:
{ /* sizeof() == 2 */
"profess" : "knight",
"attack" : 20,
}
{ }
4
512