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