[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)

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});
}
}
1
One

預設

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});
}
1
Default

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});
}
}
1
1

參考

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


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