Skip to content

[Day-23]Zig:Hash Maps 鍵值對

發佈

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


[Day-24]Zig:編譯期 Comptime
[Day-22]Zig:ArrayList

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