iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0

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 爲主。並同時發佈在:


上一篇
Zig:分配器(Allocator)
下一篇
Zig:Hash Maps 鍵值對
系列文
Zig 語言入門指南——聽説你是現代化的 C30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言