链表 - 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);
链接表可以使用 prev
和 next
函数遍历:
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
能力。它只能通过以下两种方式显式销毁:
linked_table::destroy_empty(table)
可用于销毁空表。linked_table::drop(table)
可用于删除可能不为空的表。注意,如果表很大,这可能会非常昂贵(gas消耗)。