向量映射 - VecMap

VecMap 是一种由向量支持的简单映射数据结构。该映射保证不包含重复的键,但条目并不是按键排序的——条目是按插入顺序包含的。 与向量类似,当元素数量较多时,不应使用 VecMap,因为这会导致访问和更新的 gas 成本较高。当元素数量较多时,应使用表。

VecMap 允许通过键或索引(基于插入顺序)访问。

创建一个新的 VecMap:

let map = vec_map::empty<u64, u64>();

插入一个新的键值对:

vec_map::insert(&mut map, 1, 2);

删除一个键值对:

vec_map::remove(&mut map, &1);

通过键访问元素:

let value = vec_map::get(&map, &1);

如果不确定键是否存在并且不想因为错误而中止整个交易,可以使用 try_get

let value_opt = vec_map::try_get(&map, &1);
if (option::is_some(&value_opt)) {
    let value = option::unwrap(value_opt);
}

通过索引访问元素:

let (key, value) = vec_map::get_entry_by_idx(&map, 0);

通过键修改元素:

*vec_map::get_mut(&mut map, &1) = 3;

通过索引修改元素:

*vec_map::get_entry_by_idx_mut(&mut map, 0).1 = 3;

将映射解包成键和值的向量:

let (keys, values) = vec_map::into_keys_values(map);

VecMap 不能自动丢弃。必须先明确删除所有元素,然后才能销毁 VecMap:

vec_map::destroy_empty(map);

其他有用的函数包括:

  • size: 获取映射中元素数量的
  • is_empty: 检查映射是否为空
  • keys: 获取映射中键列表