链表 - Linked Table

链表(Linked List)是一种数据结构,由一系列元素组成,每个元素指向下一个元素。链表是实现更复杂协议(如订单簿)的有用数据结构,具有以下优点:

  • 动态大小:链表是动态数据结构,可以根据需要增长和缩小。

  • 插入和删除效率高:插入和删除操作各为一步,而在向量中删除一个元素则需要移动其后的所有元素。

  • 插入顺序:元素按插入顺序存储,这对于特定程序非常有用。 在 Sui Move 中,可以使用 Linked Table 创建链表,并具有以下额外优点:

  • 扩展性:Linked Table 使用动态字段存储元素,可以用于存储大量元素。

  • 独立性:Linked Table 可以是独立对象,也可以是另一个对象的字段。

  • 迭代支持:Linked Table 可以使用 prev 和 next 函数遍历链表,无需循环。

创建 Linked Table:

let mut table = linked_table::new::<u64, u64>(ctx);

类型说明 <u64, u64> 在插入操作立即进行后实际上并不是必须的:

let mut table = linked_table::new(ctx);
linked_table::push_back(&mut table, 1, 10);

在表的前面插入键值对:

linked_table::push_front(&mut table, 2, 20);

在表的后面插入键值对:

linked_table::push_back(&mut table, 3, 30);

请注意,添加到链接表中的键必须具有 copy、drop 和 store 能力。值必须具有 store 能力。

从表中移除键值对并返回值:

let value = linked_table::remove(&mut table, 2);

链接表可以使用 prevnext 函数遍历:

let current = linked_table::front(&table);
while option::is_some(current) {
    let key = option::unwrap(current);
    let value = linked_table::borrow(&table, key);
    current = linked_table::next(&table, key);
}

当前键可以传递给其他函数以不使用循环进行迭代(例如,使用递归)。

类似于 Table,Linked Table 不能自动删除,因为它没有 drop 能力。它只能通过以下两种方式显式销毁:

  1. linked_table::destroy_empty(table) 可用于销毁空表。
  2. linked_table::drop(table) 可用于删除可能不为空的表。注意,如果表很大,这可能会非常昂贵(gas消耗)。