Hash Map 是一種 key-value pair(鍵值對),類似於 Rust 的 HashMap<K, V>
或 Python 的 dict
。
基礎
Hash Map 由 std 標準庫提供,一般來說可以使用 std.AutoHashMap(K, V)
來宣告,其中 K
是 Key 的型別,V
是 Value 的型別。由於涉及動態分配,所以也需要使用 allocator,並且搭配 defer
和 deinit()
來釋放資源。
插入資料使用 put(K, V)
。取得資料使用 get(K)
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 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}); } }
|
預設
hash_map.get()
回傳的型別是 Optional ?
,所以也可以搭配 orelse
來簡化 Key 不存在的處理。
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;
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}); }
|
String
如果你想要使用 String 作為 Key,可以直接使用 std.StringHashMap(V)
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 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}); } }
|
參考
本文以 Zig 0.13.0
為主。並同時發佈在: