iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0

Hash Map 是一種 key-value pair(鍵值對),類似於 Rust 的 HashMap<K, V> 或 Python 的 dict

基礎

Hash Map 由 std 標準庫提供,一般來說可以使用 std.AutoHashMap(K, V) 來宣告,其中 K 是 Key 的型別,V 是 Value 的型別。由於涉及動態分配,所以也需要使用 allocator,並且搭配 deferdeinit() 來釋放資源。

插入資料使用 put(K, V)。取得資料使用 get(K)

const std = @import("std");
const print = std.debug.print;

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

    const allocator = gpa.allocator();
    var map = std.AutoHashMap(u8, []const u8).init(allocator);
    defer map.deinit();

    // Insert
    try map.put(0, "Zero");
    try map.put(1, "One");
    try map.put(2, "Two");

    const value = map.get(1);
    if (value) |v| {
        print("{s}", .{v});
    }
}
One

預設

hash_map.get() 回傳的型別是 Optional ?,所以也可以搭配 orelse 來簡化 Key 不存在的處理。

const std = @import("std");
const print = std.debug.print;

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

    const allocator = gpa.allocator();
    var map = std.AutoHashMap(u8, []const u8).init(allocator);
    defer map.deinit();

    // Insert
    try map.put(0, "Zero");
    try map.put(1, "One");
    try map.put(2, "Two");

    const value = map.get(99) orelse "Default";
    print("{s}", .{value});
}
Default

String

如果你想要使用 String 作爲 Key,可以直接使用 std.StringHashMap(V)

const std = @import("std");
const print = std.debug.print;

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

    const allocator = gpa.allocator();
    var map = std.StringHashMap(u8).init(allocator);
    defer map.deinit();

    // Insert
    try map.put("Zero", 0);
    try map.put("One", 1);
    try map.put("Two", 2);

    const value = map.get("One");
    if (value) |v| {
        print("{}", .{v});
    }
}
1

參考

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


上一篇
Zig:ArrayList
下一篇
Zig:編譯期 Comptime
系列文
Zig 語言入門指南——聽説你是現代化的 C30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言