使用 ArrayList 管理动态列表
扩展由分配器支持的缓冲区。
使用 ArrayList 管理动态列表 是 CoddyKit 上的免费 Zig Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Zig Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Zig Academy 课程共包含 4 节课。
可增长的缓冲区
有时您事先不知道大小。std.ArrayList 是一种动态数组,会随着您添加项目而增长,并由分配器提供支持。📈
它是泛型的
ArrayList 是一种泛型类型:您只需指定一次元素类型,就能得到一个完全由该类型组成且具备完整类型安全性的列表。
const List = std.ArrayList(i32);使用 init 创建
使用 init 创建列表,并将它用于增长的分配器传入其中。该分配器会在列表的整个生命周期内与列表关联。
var list = std.ArrayList(i32).init(allocator);始终调用 deinit
列表拥有堆内存,因此要将 init 与 deinit 配对以释放内存。在 init 后立即使用 defer,可以让清理自动执行。
var list = std.ArrayList(i32).init(a);
defer list.deinit();追加项目
使用 append 添加一个元素。它可能需要增大缓冲区,因此可能失败,也就需要使用 try 调用。
try list.append(7);访问数据
当前内容存放在 .items 切片中。您可以像操作其他 Zig 切片一样读取、索引和遍历该切片。
for (list.items) |n| std.debug.print("{}\n", .{n});长度与容量
长度是 list.items.len,表示您存储了多少个值。容量是预留的空间,可能更大,以避免频繁增长。
提前预留空间
如果您大致知道所需大小,请先调用 ensureTotalCapacity。一次性预留可以避免列表填满时反复重新分配。
try list.ensureTotalCapacity(100);移除项目
使用 pop 移除最后一个元素,或按索引移除中间的元素。列表会缩短长度,但会保留容量。
const last = list.pop();转移所有权
调用 toOwnedSlice 将缓冲区取出为普通切片。列表会变空,而您需要负责释放该切片。
const slice = try list.toOwnedSlice();建立在基础之上
ArrayList 只是替您完成了 alloc、复制和 free。它展示了显式分配器配合整洁且可复用的类型能够实现多大的能力。✅
快速检查
回想一下,ArrayList 不再使用时,您必须做什么。
回顾
您已经学会,std.ArrayList 会借助分配器动态增长:使用 init,使用 try 调用 append,读取 .items,并在完成后始终调用 deinit。🎯
常见问题解答
「使用 ArrayList 管理动态列表」课时是免费的吗?
是的 — 「使用 ArrayList 管理动态列表」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Zig Academy 课程的其余内容,请升级到 CoddyKit PRO。 Zig Academy 课程共包含 4 节课。
「使用 ArrayList 管理动态列表」这节课中我会学到什么?
扩展由分配器支持的缓冲区。 你通过在浏览器中直接运行的动手代码来练习 Zig Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Zig Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Zig Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「使用 ArrayList 管理动态列表」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Zig Academy 课中编写并运行代码吗?
能。每节 Zig Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 为何 Zig 没有隐藏的内存分配
- 分配器接口
- alloc、free、create、destroy
- 使用 ArrayList 管理动态列表