大向量 - Table Vec

标准向量在添加大量项目时效率不高(超过几十个项目)。这是因为向量越大,更新它所需的 gas 越多, 例如添加一个新元素会导致更多的 I/O 成本来执行这样的交易。一般来说,开发者应该使用基于表的向量(TableVec)来存储大量项目。 TableVec 是一种使用 Table 模块实现的可扩展向量。它在添加、删除和访问元素时非常高效。

创建 TableVec:

let t = table_vec::empty::<u64>(ctx);

请注意,TableVec 只能用于存储具有 store 能力的值。这包括所有基本类型和具有 store 能力的结构体。

向 TableVec 的末尾添加元素:

table_vec::push_back(&mut t, 10);

获取 TableVec 的长度:

let len = table_vec::length(&t);

获取特定索引处的元素:

let element = table_vec::borrow(&t, 0);

从 TableVec 中移除最后一个元素:

let last_element = table_vec::pop_back(&mut t);

移除特定索引处的元素:

let element = table_vec::swap_remove(&mut t, 0);

类似于 Table 和 LinkedTable,TableVec 不能自动丢弃,必须显式销毁:

  1. 如果 TableVec 为空,可以使用 table_vec::destroy_empty(t) 销毁。
  2. 如果 TableVec 非空,可以使用 table_vec::drop(t) 丢弃。使用此函数时请谨慎,因为如果 TableVec 很大,执行可能需要消耗大量的 gas。

修改特定索引处的元素:

let mut element = table_vec::borrow_mut(&mut t, 0);
*element = 20;