[Day-22]Zig:ArrayList

ArrayList 是一種動態的數組容器,可以儲存相同型別、不定長度的資料(執行期分配),類似 Rust 中的 Vec<T>

基礎

ArrayList 是由標準庫提供的。由於是動態分配的型別,所以要使用它的話需要透過 Allocator 來分配,並且也需要 defer 做好釋放資源的處理。只要系統可以成功分配空間,ArrayList 的長度就可以一直加。使用 items 欄位存取成員。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const std = @import("std");
const print = std.debug.print;
const ArrayList = std.ArrayList;

pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();

const allocator = gpa.allocator();
var list = ArrayList(i8).init(allocator);
defer list.deinit();

try list.append(1);
try list.append(2);
try list.append(-3);

print("{}, {}, {}\n", .{ list.items[0], list.items[1], list.items[2] });
}
1
1, 2, -3

for

其成員也可以用 for 迴圈處理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const std = @import("std");
const print = std.debug.print;
const ArrayList = std.ArrayList;

pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();

const allocator = gpa.allocator();
var list = ArrayList(i8).init(allocator);
defer list.deinit();

try list.append(1);
try list.append(2);
try list.append(-3);

for (list.items) |item| {
print("{}, ", .{item});
}
}
1
1, 2, -3,

型別

使用 @TypeOf() 查看具體型別。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const std = @import("std");
const print = std.debug.print;
const ArrayList = std.ArrayList;

pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();

const allocator = gpa.allocator();
var list = ArrayList(i8).init(allocator);
defer list.deinit();

try list.append(1);
try list.append(2);
try list.append(-3);

print("{}\n", .{@TypeOf(list)});
print("{}", .{@TypeOf(list.items)});
}
1
2
array_list.ArrayListAligned(i8,null)
[]i8

參考

本文以 Zig 0.13.0 為主。並同時發佈在:


留言可能不會立即顯示。若過了幾天仍未出現,請 Email 聯繫:)