Skip to content

[Day-22]Zig:ArrayList

發佈

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

基礎

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

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, 2, -3

for

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

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, 2, -3,

型別

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

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)});
}
array_list.ArrayListAligned(i8,null)
[]i8

參考

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


[Day-23]Zig:Hash Maps 鍵值對
[Day-21]Zig:分配器(Allocator)

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