最近新闻看到17岁中专女生拿下阿里全球数学竞赛第12名。咱们学习标准库中的数据结构是和学习数学是一脉相承的,结构体很多,也非常枯燥,但是不能全面解读过一遍,你很难写出合理的代码。所以,这一章节我们开始深度解析Zig中的数据结构,大家坐稳,让我们一起小跑前进。
1.1 ArrayList
Zig中广泛使用了std.ArrayList,它充当了一个可以动态改变大小的缓冲区。std.ArrayList(T)类似于C++中的std::vector和Rust中的Vec。deinit()方法会释放ArrayList的所有内存。我们可以通过其切片字段(.items)来读取和写入其中的数据。
接下来,我们将讲解测试分配器(std.testing.allocator)的使用方式。这是一种特殊的分配器,仅在测试环境中生效,并具备检测内存泄漏的功能。在实际编码过程中,请根据具体需求选择合适的分配器。
const std = @import("std");
const expect = std.testing.expect;
const eql = std.mem.eql;
const ArrayList = std.ArrayList;
const test_allocator = std.testing.allocator;
test "arraylist" {
var list = ArrayList(u8).init(test_allocator);
defer list.deinit();
try list.append('H');
try list.append('e');
try list.append('l');
try list.append('l');
try list.append('o');
try list.appendSlice(" World!");
try expect(eql(u8, list.items, "Hello World!"));
}
1.2 BoundedArray
BoundedArray
是一种结构,它包含一个固定大小的数组以及当前正在使用的长度。
它可以被用作一个变长数组,可以自由地调整大小至支持数组的最大尺寸。
如果你正在寻找Zig语言中类似于Rust超级实用的ArrayVec
的等价物,这就是你想要的。
当需要传